相同的命令在执行时有效,但在第二次执行时会抛出异常吗?

时间:2017-01-19 08:43:37

标签: python python-3.x selenium-webdriver

所以我很新,并试图找出在python中使用的东西。

元素:

<div id="scroll2" class="fm2 p8 cur m_bt2" onclick="javascript:displayResultsLogin('scroll2')"> Show More Results </div>

Xpath://*[@id="scroll2"]

我使用shell执行:

wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//*[contains(text(), ' Show More Results')]")))
element.click()

完成上述操作后,元素:

<div id="scroll3" class="fm2 p8 cur m_bt2" onclick="javascript:displayResultsLogin('scroll3')"> Show More Results </div>

XPath://*[@id="scroll3"]

当我再次执行相同的命令时,它会引发异常:

wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//*[contains(text(), ' Show More Results')]")))
element.click()

异常

  

追踪(最近一次通话):    文件&#34;&#34;,第1行,in       element = wait.until(EC.element_to_be_clickable((By.XPATH,&#34; // * [contains(text(),&#39; Show More Results&#39;)]&#34;)))     文件&#34; C:\ Python34 \ lib \ site-packages \ selenium \ webdriver \ support \ wait.py&#34;,第80行,直到       引发TimeoutException(消息,屏幕,堆栈跟踪)   selenium.common.exceptions.TimeoutException:消息:

无法理解原因。或者解决它。

1 个答案:

答案 0 :(得分:3)

我坚信这与你正在测试的应用程序的构建方式有关:似乎点击 scroll2 按钮会使那个看不见并添加 scroll3 按钮到页面。

之后,当你调用 wait.until(...)时会发生什么事情,WebDriver会找到 scroll2 按钮(因为XPath表达式只检查内部文本仍将匹配它),然后将等待它可以点击,它永远不会,因为它不再可见。

您可以使用这样的简单网页重新创建:

<html>
    <head>    
        <script>
            document.onreadystatechange = function() {
                var element = document.getElementById("1");

                element.addEventListener("click", function() {
                    this.style.display = "none";

                    document.getElementById("2").style = "";
                });
            }
        </script>
    </head>
    <body>
        <div id="1">Show More Results</div>
        <div id="2" style="display:none">Show More Results</div>
    </body>
</html>

这个python片段:

wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//*[contains(text(), 'Show More Results')]")))
element.click()

wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//*[contains(text(), 'Show More Results')]")))
element.click()

即使页面在视觉上看起来正确,第二个 wait.until(...)也会超时。

基本上有两种解决方案:

  • 更改HTML,以便在添加scroll3按钮后,实际上会从DOM中删除scroll2按钮,或
  • 更改测试,以便它以更稳定的方式找到要单击的按钮。例如,对于上面提到的示例,您可以将显示样式添加到XPath定位器,以确保只查找显示的元素。

示例:

wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//*[contains(text(), 'Show More Results') and not(contains(@style, 'display: none'))]")))
element.click()

wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//*[contains(text(), 'Show More Results') and not(contains(@style, 'display: none'))]")))
element.click()

请注意,您可能还必须在定位器中包含祖先可见性,有关详细信息,请参阅此问题:How do I select only visible elements using XPath?