【问题标题】:Selenium Web Driver(Firefox) fails sometimes to find an element by id which is present in the web pageSelenium Web Driver(Firefox) 有时无法通过 id 找到网页中存在的元素
【发布时间】:2013-03-23 11:53:22
【问题描述】:

我正在使用Selenium Web Driver for Fire Fox 来自动化Python 中的网页。

问题是,有时对于某些元素,我会收到NoSuchElementException,即使该元素与我正在搜索的 id 存在。

我正在使用find_element_by_id(id) 方法。

我的代码是

d = webdriver.Firefox()

elm5 = d.find_element_by_id("ctl00_bodyContent_tabGroupAdmin")

elm5.click()

该元素的 HTML 是:

<div id="ctl00_bodyContent_tabGroupAdmin" class="tab">
                <div onclick="OpenTab(3); DisableProgressBarDisplay(); return false;">
                    Group Administrators</div>
                <div class="cap_right">
                </div>
            </div>

有人遇到过同样的问题吗?请提出一些解决方法。

谢谢

【问题讨论】:

  • Selenium 和 Firefox 的组合并不总是很好。您确实需要兼容的版本。这可能是问题所在。如果出现同样的问题,试试 Chrome? previous answer of mine

标签: firefox selenium python-2.7 automation selenium-webdriver


【解决方案1】:

我建议您必须等待元素出现。

看看这个answer about how to wait

我们也遇到过这个问题,有时在使用 selenium 时。页面太慢了。

【讨论】:

    【解决方案2】:

    我对 Python 一无所知,但是我正在使用 java 使用 selenium Webdriver,我想问题出在 bcz 上,可能你没有切换到当前帧。 您可以通过向上检查您的 html 内容来检查这一点,您将能够找到当前帧。

    在java中,我们曾经这样做 driver.switchTo().frame(driver.findElement(By.name("officePane")));

    你可以在python中检查这个类似的,希望对你有帮助。

    【讨论】:

      【解决方案3】:
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support import expected_conditions as EC
      from selenium.webdriver.support.ui import WebDriverWait
      

      将这些添加到代码的开头并

      WebDriverWait(d, 20).until(EC.presence_of_element_located((By.ID, "ctl00_bodyContent_tabGroupAdmin")))
      

      顺便说一句,您可以在一行中查找并单击元素:

      d.find_element_by_id("ctl00_bodyContent_tabGroupAdmin").click()
      

      祝你好运,感谢User 为我们教授这个解决方案。

      【讨论】:

        【解决方案4】:

        希望您的问题现在得到解决。但自上周以来,我面临着同样的问题。 这是您的问题的以下代码。 当元素被频繁检测到有时不被检测到时,它会检测框架并专门定位元素。

        WebDriver d = new FirefoxDriver();  <-- Intialize your Firefox driver
        WebDriverWait  frame = new WebDriverWait(driver, 50); <-- Creating wait object for frame
        frame.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.tagName("iframe")));
        WebDriverWait wait1 = new WebDriverWait(driver, 50); <-- Creating wait object for element 
        wait1.until(ExpectedConditions.elementToBeClickable(find_element_by_id("ctl00_bodyContent_tabGroupAdmin"))).click();
        

        如果没有解决,希望这能解决您的问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-10-18
          • 1970-01-01
          • 2017-07-23
          • 1970-01-01
          • 1970-01-01
          • 2018-03-05
          • 2014-11-12
          相关资源
          最近更新 更多