2014-10-22 19 views
1

我有一個簡單的自動填充登錄表單域。事實上,它通過很好,但有問題。腳本填充字段後,我需要在控制檯中查看實際輸出,例如「已成功登錄」或「未找到用戶名」。我嘗試了很多東西,但沒有任何工作是這樣的,我的最後一次嘗試是while循環,並且效果很好,但只有當我有積極的結果。我寫了第二個條件,但是當我輸入不正確的數據時,它使我瘋狂地在我的控制檯中看到所有這些錯誤。所以這裏是代碼和輸出的一部分。硒2和python的問題3.4.1

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import Select 
from selenium.common.exceptions import NoSuchElementException 

baseurl = "http://www.somesite/login" 
email = input("Type an email: ") 
password = input("Type a password: ") 

xpaths = { 'loginBox' : "//input[@id='session_email']", 
      'passwordBox' : "//input[@id='session_password']", 
      'submitButton' : "//input[@class='ufs-but']", 
      'success' : "//div[@class='flash-message success']", 
      'error' : "//span[@class='form_error']" 
     } 


mydriver = webdriver.Firefox() 
mydriver.get(baseurl) 


mydriver.find_element_by_xpath(xpaths['loginBox']).send_keys(email) 


mydriver.find_element_by_xpath(xpaths['passwordBox']).send_keys(password) 


mydriver.find_element_by_xpath(xpaths['submitButton']).click() 


while mydriver.find_element_by_xpath(xpaths['success']): 
    print("Success") 
    if mydriver.find_element_by_xpath(xpaths['error']): 
     print("No") 

還有就是我,當我嘗試中斷的錯誤:

File "ab.py", line 32, in <module> 
    while mydriver.find_element_by_xpath(xpaths['success']): 
    File "/usr/local/lib/python3.4/site-packages/selenium-2.43.0-py3.4.egg/selenium/webdriver/remote/webdriver.py", line 230, in find_element_by_xpath 
    return self.find_element(by=By.XPATH, value=xpath) 
    File "/usr/local/lib/python3.4/site-packages/selenium-2.43.0-py3.4.egg/selenium/webdriver/remote/webdriver.py", line 662, in find_element 
    {'using': by, 'value': value})['value'] 
    File "/usr/local/lib/python3.4/site-packages/selenium-2.43.0-py3.4.egg/selenium/webdriver/remote/webdriver.py", line 173, in execute 
    self.error_handler.check_response(response) 
    File "/usr/local/lib/python3.4/site-packages/selenium-2.43.0-py3.4.egg/selenium/webdriver/remote/errorhandler.py", line 166, in check_response 
    raise exception_class(message, screen, stacktrace) 
selenium.common.exceptions.NoSuchElementException: Message: 'Unable to locate element: {"method":"xpath","selector":"//div[@class=\'flash-message success\']"}' ; Stacktrace: 
    at FirefoxDriver.prototype.findElementInternal_ (file:///tmp/tmpjax8kj1u/extensions/[email protected]/components/driver-component.js:9618:26) 
    at FirefoxDriver.prototype.findElement (file:///tmp/tmpjax8kj1u/extensions/[email protected]/components/driver-component.js:9627:3) 
    at DelayedCommand.prototype.executeInternal_/h (file:///tmp/tmpjax8kj1u/extensions/[email protected]/components/command-processor.js:11612:16) 
    at DelayedCommand.prototype.executeInternal_ (file:///tmp/tmpjax8kj1u/extensions/[email protected]/components/command-processor.js:11617:7) 
    at DelayedCommand.prototype.execute/< (file:///tmp/tmpjax8kj1u/extensions/[email protected]/components/command-processor.js:11559:5) 

正如我所說的,全成的結果是沒有問題的。

UPD。我糾正我的代碼的最後一點點,現在我有這個:

while mydriver.find_element_by_xpath(xpaths['success']): 
    print("Success") 
    break 
while mydriver.find_element_by_xpath(xpaths['error']): 
    print("No") 
    break 

和它的作品,但不喜歡我想要的,輸出的時候我想陰性結果:

Type an email: w 
Type a password: wer 
Success 
No 

正如你所看到的,當結果是積極的時候,我想看到'成功',當它是消極時,'不',但我不想同時看到它們。

UPD。道具Macro Giancarli爲巨大的幫助,所以這就是我得到了我到底要:

try: 
    success = True 
    success_element = mydriver.find_element_by_xpath(xpaths['success']) 
except NoSuchElementException: 
    success = False 
    print("Can't log in. Check email and/or password") 
try: 
    failure = True 
    failure_element = mydriver.find_element_by_xpath(xpaths['error']) 
except NoSuchElementException : 
    failure = False 
    print("Logged in successfully") 

回答

0

的問題看起來像它在你的末端結構while循環的方式。你不應該爲了檢查成功或失敗而循環。

假設您輸入登錄數據,請考慮有四個結果。您可以找到確定成功的元素,找到確定失敗的元素,找到兩者(應該是不可能的),或者找不到(可能在出現意外屏幕或加載頁面失敗的情況下)。

不要期望從webdriver查詢中返回一些值,請嘗試將它們放在try塊中以捕獲NoSuchElementException並檢查非None內容。另外,請嘗試處理這四種情況中的每一種,以避免您的程序崩潰。

編輯:

試試這個。

try: 
    success = True 
    success_element = mydriver.find_element_by_xpath(xpaths['success']) 
except NoSuchElementException: 
    success = False 
try: 
    failure = True 
    failure_element = mydriver.find_element_by_xpath(xpaths['error']) 
except NoSuchElementException : 
    failure = False 
# now handle the four possibilities