【问题标题】:raise TimeoutException(message, screen, stacktrace) TimeoutException: Message:引发 TimeoutException(消息,屏幕,堆栈跟踪) TimeoutException:消息:
【发布时间】:2022-02-16 12:34:33
【问题描述】:

我是 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()

当我运行它进入 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

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

【问题讨论】:

  • 好像超时了。

标签: python selenium selenium-webdriver


【解决方案1】:

对于初学者来说,超时值太小,请增加它。另外,您可以只定义一次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))

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

【讨论】:

  • 感谢您的回复,这样做了,但仍然给我同样的错误。
  • @2one2 知道了,更新了答案。我想这现在可以解决了。谢谢。
  • 非常感谢它的工作,我用 xpath 更改了 id 并使用了 find_element_by_xpath,但我能问一下为什么我不应该使用 find element by id 吗?
  • 这个错误是否意味着 selenium 没有找到输入框所以它自己终止了?
  • @2one2 问题出在您定位“登录”按钮时,将 XPath 表达式传递给find_element_by_id()。页面上没有id="//input[@value='Log in']" 的元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
  • 2017-03-30
相关资源
最近更新 更多