【问题标题】:Selenium Webdriver - NoSuchElementExceptionsSelenium Webdriver - NoSuchElementExceptions
【发布时间】:2013-05-20 07:28:55
【问题描述】:

我正在使用带有 selenium webdriver 的 python 单元测试库 (unittest)。我正在尝试按其名称查找元素。大约有一半的时间,测试会抛出 NoSuchElementException,而其他时候则不会抛出异常。

我想知道这是否与 selenium webdriver 没有等待足够长的时间来加载页面有关。

【问题讨论】:

    标签: python selenium webdriver


    【解决方案1】:

    我也看到了。我所做的就是等待它......

    你可以试试:

    while True:
        try:
            x = driver.find_by_name('some_name')
            break
        except NoSuchElementException:
            time.sleep(1)
            # possibly use driver.get() again if needed
    

    另外,请尝试使用 pip install --update selenium 将您的 selenium 更新到最新版本

    【讨论】:

      【解决方案2】:

      处理等待元素出现的一种方法如下:

      import selenium.webdriver.support.ui as ui
      wait = ui.WebDriverWait(driver,10)
      wait.until(lambda driver: driver.find_by_name('some_name') )
      elem = driver.find_by_name('some_name')
      

      你是正确的,webdriver没有等待页面加载,没有内置的默认等待driver.get()

      【讨论】:

        【解决方案3】:
        driver = webdriver.WhatEverBrowser()
        driver.implicitly_wait(60) # This line will cause it to search for 60 seconds
        

        它只需要在你的代码中插入一次(我通常在创建 webdriver 对象后立即执行)

        例如,如果您的页面由于某种原因需要 30 秒才能加载(购买新服务器),并且该元素是页面上最后显示的内容之一,它几乎只是一遍又一遍地检查再次,如果元素存在 60 秒,那么如果它没有找到它,它会抛出异常。

        还要确保您的范围是正确的,即:如果您专注于一个框架,并且您要查找的元素不在该框架中,它将不会找到它。

        【讨论】:

        • 很酷,我从来不知道你能做到这一点,还有关于框架的好点,这让我之前绊倒了
        • 它确实让 selenium 历史上的每一个 webriver 用户都陷入了困境。我曾经写过完整的定义,比如@Akkabar 对此的回答,然后有一天偶然发现它就像“哇,这些人已经想到了”
        • driver.get() 是阻塞操作; webdriver 浏览器插件不会响应调用客户端(以您选择的语言绑定),直到驱动程序确定页面已完全加载,基本上是在所有 GET 已返回并且 DOM 完成时。但是,如果您有异步内容(在初始页面加载完成后修改 DOM 的 JS 等),您可能需要等待一个元素,因为它不会在初始完成的 DOM 中。设置全局隐式等待是一种快速解决方法,但如果测试运行时对您很重要,它可能会产生负面影响。
        • 我同意 @sr2222 ,特别是如果您使用 try 语句。
        【解决方案4】:

        我把钱放在了框架上,因为我以前遇到过类似的问题 :)

        再次检查您的 html 并检查您是否正在处理框架。如果是那么切换到正确的框架将能够定位元素。

        Python

        driver.switch_to_frame("frameName")
        

        然后搜索元素。

        如果没有,请尝试按照其他人的建议设置等待时间。

        【讨论】:

          【解决方案5】:

          要解决此查询,您必须定义显式等待。这样在页面加载之前它不会搜索任何 WebElement。 下面的 url 帮助。 http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp

          【讨论】:

            【解决方案6】:

            你需要有一个 waitUntil (你的元素加载)。如果您确定您的元素最终会出现在页面上,这将确保只有在您预期的元素加载后才会进行验证。

            【讨论】:

              【解决方案7】:

              我觉得可能是同步问题(即 webdriver 速度和应用程序速度不匹配)

              使用隐式等待:

              driver.manage.timeouts.implicitlyWait(9000  TIMEUNITS.miliseconds)
              

              Reference

              【讨论】:

                猜你喜欢
                • 2016-01-14
                • 2011-06-18
                • 2016-05-21
                • 2015-05-15
                • 2013-07-07
                • 2011-12-21
                • 2015-09-28
                • 2020-07-13
                • 1970-01-01
                相关资源
                最近更新 更多