同一个命令在执行时只起一次作用,但在第二次执行时抛出异常?

2024-10-01 09:26:04 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我是一个新手,正在尝试找出一些在python中使用的东西。在

元素:

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

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

我使用shell执行:

^{pr2}$

执行上述操作后,元素:

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

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

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

^{pr2}$

例外

Traceback (most recent call last): File "", line 1, in element = wait.until(EC.element_to_be_clickable((By.XPATH, "//*[contains(text(), ' Show More Results')]"))) File "C:\Python34\lib\site-packages\selenium\webdriver\support\wait.py", line 80, in until raise TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: Message:

不明白为什么。或者绕道而行。在


Tags: divid元素moreshowjavascriptresultsclass
1条回答
网友
1楼 · 发布于 2024-10-01 09:26:04

我坚信这与您正在测试的应用程序的构建方式有关:似乎单击scroll2按钮会使该应用程序不可见,并将scroll3按钮添加到页面中。在

之后,当你打电话给等等,直到(…)发生的情况是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片段:

^{pr2}$

这里还有第二个等等,直到(…)将超时,即使页面在视觉上看起来是正确的。在

基本上有两种解决方案:

  • 更改HTML,这样一旦添加了scroll3按钮,scroll2按钮实际上就从DOM中删除了,或者
  • 更改测试,使其能够以更稳定的方式定位要单击的按钮。例如,对于上面提到的示例,您可以将显示样式添加到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?

相关问题 更多 >