引发 TimeoutException(message, screen, stacktrace) TimeoutException: Message:

2on*_*ne2 4 python selenium selenium-webdriver

我一般是 Python 和 selenium 的新手,我正在尝试在 youtube 上看到的一个例子。这是代码示例:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
import unittest 

class LoginTest(unittest.TestCase):

def test_Login(self):
    self.driver = webdriver.Firefox()
    self.driver.get("https://www.facebook.com/")
    driver = self.driver
    facebookUsername = "xxxxxxxx"
    facebookPassword = "xxxxxxxx"

    emailFieldId="email"
    passFieldId ="pass"
    loginButtonXpath="//input[@value='Log in']"
    fbLogoXpath = "(//a[contains(@href,'logo')])[1]"

    emailFieldElement = WebDriverWait(driver, 1).until(lambda driver: driver.find_element_by_id(emailFieldId))
    passFieldElement = WebDriverWait(driver, 1).until(lambda driver: driver.find_element_by_id(passFieldId))
    loginButtonElement = WebDriverWait(driver, 1).until(lambda driver: driver.find_element_by_id(loginButtonXpath))

    emailFieldElement.clear()
    emailFieldElement.send_keys(facebookUsername)
    passFieldElement.clear()
    passFieldElement.send_keys(facebookPassword)
    loginButtonElement.click()
    WebDriverWait(driver, 1).until(lambda driver:     driver.find_element_by_id(fbLogoXpath))
def tearDown(self):
    self.driver.quit()

if __name__ == "__main__":
unittest.main()
Run Code Online (Sandbox Code Playgroud)

当我运行它进入 facebook 的代码时,但停止并给我这个错误。

ERROR: test_Login (__main__.LoginTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "facebot.py", line 25, in test_Login
    loginButtonElement = WebDriverWait(driver, 1).until(lambda driver: driver.find_element_by_id(loginButtonXpath))
  File "C:\Python27\lib\site-packages\selenium\webdriver\support\wait.py", line 76, in until
    raise TimeoutException(message, screen, stacktrace)
TimeoutException: Message:
Stacktrace:
    at FirefoxDriver.prototype.findElementInternal_ (file:///c:/users/ale/appdata/local/temp/tmpmle1b1/extensions/fxdriv
er@googlecode.com/components/driver-component.js:10667)
    at FirefoxDriver.prototype.findElement (file:///c:/users/ale/appdata/local/temp/tmpmle1b1/extensions/fxdriver@google
code.com/components/driver-component.js:10676)
    at DelayedCommand.prototype.executeInternal_/h (file:///c:/users/ale/appdata/local/temp/tmpmle1b1/extensions/fxdrive
r@googlecode.com/components/command-processor.js:12643)
    at DelayedCommand.prototype.executeInternal_ (file:///c:/users/ale/appdata/local/temp/tmpmle1b1/extensions/fxdriver@
googlecode.com/components/command-processor.js:12648)
    at DelayedCommand.prototype.execute/< (file:///c:/users/ale/appdata/local/temp/tmpmle1b1/extensions/fxdriver@googlec
ode.com/components/command-processor.js:12590)

----------------------------------------------------------------------
Ran 1 test in 16.262s
Run Code Online (Sandbox Code Playgroud)

我曾尝试通过查看 youtube 来修复它,但我卡住了,不知道会是什么。

ale*_*cxe 6

对于初学者来说,超时值太小,增加它。另外,您只能定义WebDriverWait实例一次并重复使用:

wait = WebDriverWait(driver, 10)

emailFieldElement = wait.until(lambda driver: driver.find_element_by_id(emailFieldId))
passFieldElement = wait.until(lambda driver: driver.find_element_by_id(passFieldId))
loginButtonElement = wait.until(lambda driver: driver.find_element_by_xpath(loginButtonXpath))
Run Code Online (Sandbox Code Playgroud)

另外,请注意,您应该在定位“登录”按钮时使用find_element_by_xpath()而不是find_element_by_id()