Скрипт входа Selenium не работает для формы с использованием j_security_check

Я пытаюсь автоматизировать сценарий входа в систему, который отправляет форму с помощью j_security_check с помощью скрипта селена.

Ниже приведен html-код:

<form name="getuserin" action="j_security_check" method="POST">
<table width="45%" align="left">
   <tr>
      <td align="left">Uname</td>
      <td><input type="text" name="j_username"></td>
   </tr>

   <tr>
      <td align="right">Passkey</td>
      <td><input type="password" name="j_password"></td>
   </tr>
</table>

<br>
<center><input type="submit" name="action" value="Login"></center>
</form>

код селена

WebDriver driver = new FirefoxDriver();

driver.findElement(By.name("j_username")).sendKeys("validuser");
driver.findElement(By.name("j_password")).sendKeys("password");
driver.findElement(By.name("action")).click();

Скрипт работает успешно, без ошибок. Проблема, с которой я сталкиваюсь, заключается в том, что во время запуска скрипта не выполняется действие входа в систему, он вводит данные и нажимает кнопку. Всякий раз, когда я пытаюсь войти с теми же учетными данными вручную, это работает! Я пробовал сценарий с Internet Explorer и Firefox.


person ram_c    schedule 13.08.2015    source источник
comment
Извините за глупый вопрос: разве j_security_check не использовал j_username и j_password в качестве имени поля?   -  person Ken Cheung    schedule 13.08.2015


Ответы (2)


Вы пытались установить точку торможения после нажатия на кнопку и посмотреть, входит ли она в систему?

Мои предложения:

  1. Возможно, вы закрываете скрипт перед отправкой данных на сервер.
  2. Может быть, вы нажимаете кнопку до того, как она загрузится.

Во втором случае вам нужно дождаться загрузки страницы и всех ее скриптов. Прежде чем думать, как это сделать, попробуйте установить простой режим ожидания потока на 2 секунды, прежде чем нажимать эту кнопку.

Если это поможет, вам нужно выяснить, что обрабатывает эту кнопку, и дождаться ее загрузки.

person Denis Koreyba    schedule 13.08.2015
comment
Скрипт активен после отправки данных на сервер. Я пытался перевести поток в спящий режим на срок до 3 минут, но ни один из них не работает. Пробовал ставить точку останова, но бесполезно. Я не получаю никакой помощи оттуда. - person ram_c; 14.08.2015

Попробуйте этот код:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
from itertools import cycle
import time
#importing various modules for added functionality



browser = webdriver.Firefox()
browser.get("http://www.example.com")
#creates browser object  
#b.o. makes GET request to specified site

username = browser.find_element_by_id("email")
password = browser.find_element_by_id("password")   
##looks for the html element "email" on above site
##looks for the html element "password" on above site



with open('creds.txt', 'r') as fp:
        credentials = [x.strip().split(':') for x in fp.readlines()]

for uname,pwd in cycle(credentials):

    username.send_keys(username from creds.txt file)
    password.send_keys(password from creds.txt file) 
    ##send username from file as email element value
    ##send password from file as password element value

    login_attempt = browser.find_element_by_id("signInBtn")
    login_attempt.click()
    ##looks for the html element "signInBtn" on above site
    ##simulates clicking of button

    time.sleep(2)

    title = browser.title
    print title
    #find the title of the html page and print it

    welcome = browser.find_element_by_id("specific_element")
    welcome_text = welcome.text.split()[1]
    read_welcome = welcome_text.encode('utf-8')
    #after successful login, look for element that is only present after successful login
    #Welcome, <name>; only want the name here
    #name was displaying in unicode for some reason, this converts the name as a normal string

    if 'specific_string' in title:
    #if string found in title variable
        print "Login Sucessful for %r " % read_welcome
        #"Login Successful for <name>"
        browser.get("http://www.link_to_sign_out")
        #simulate signing out


    elif 'specific_string' not in title:
    #if string not found in title variable
        print "Sign In failed.."  
        #"Sign In failed.."
        browser.get("http://www.link_to_sign_out")
        ##simulate signing out

    else:
        print 'Error..'
        #If neither condition is met "Error" is printed

    browser.close()
person victor martinez    schedule 29.06.2019