Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 同一命令在执行时工作一次,但在第二次执行时引发异常?_Python_Python 3.x_Selenium Webdriver - Fatal编程技术网

Python 同一命令在执行时工作一次,但在第二次执行时引发异常?

Python 同一命令在执行时工作一次,但在第二次执行时引发异常?,python,python-3.x,selenium-webdriver,Python,Python 3.x,Selenium Webdriver,所以我是一个新手,正在尝试找出一些在python中使用的东西 要素: <div id="scroll2" class="fm2 p8 cur m_bt2" onclick="javascript:displayResultsLogin('scroll2')"> Show More Results </div> <div id="scroll3" class="fm2 p8 cur m_bt2" onclick="javascript:displayResultsL

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

要素:

<div id="scroll2" class="fm2 p8 cur m_bt2" onclick="javascript:displayResultsLogin('scroll2')"> Show More Results </div>
<div id="scroll3" class="fm2 p8 cur m_bt2" onclick="javascript:displayResultsLogin('scroll3')"> Show More Results </div>
一旦执行了上述操作,元素:

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

回溯(最近一次呼叫最后一次): 文件“”,第1行,在 element=wait.until(EC.element可点击((By.XPATH,“/*[contains(text(),'Show More Results')])) 文件“C:\Python34\lib\site packages\selenium\webdriver\support\wait.py”,第80行,直到 引发TimeoutException(消息、屏幕、堆栈跟踪) selenium.common.Exception.TimeoutException:消息:


无法理解为什么。或者一种解决方法。

我坚信这与您正在测试的应用程序的构建方式有关:似乎单击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>
这里还有第二个wait.until(…)将超时,即使页面在视觉上看起来是正确的

基本上有两种解决方案:

  • 更改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()

请注意,您可能还必须在定位器中包含祖先可见性,有关详细信息,请参阅此问题:

我坚信这与您正在测试的应用程序的构建方式有关:似乎单击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>
这里还有第二个wait.until(…)将超时,即使页面在视觉上看起来是正确的

基本上有两种解决方案:

  • 更改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()

请注意,您可能还必须在定位器中包含祖先可见性,有关详细信息,请参阅此问题:

ShowCompleteExceptionlog@Andersson使用异常日志更新。问题是我可以看到显示的元素并准备好单击。它是否在页面上实际可见,或者您应该先向下滚动才能看到此按钮?向下滚动一点,但第一次单击此按钮时也是如此。在此之前,我打算尝试一个向下滚动的命令,但仍然很好奇为什么它第一次工作(按钮在类似的位置,看不见)并且没有显示下一个显示完全异常log@Andersson使用异常日志更新。问题是我可以看到显示的元素并准备好单击。它是否在页面上实际可见,或者您应该先向下滚动才能看到此按钮?向下滚动一点,但第一次单击此按钮时也是如此。在此之前,我打算尝试一个向下滚动的命令,但仍然很好奇为什么它第一次起作用(按钮在类似的位置,看不见),并且没有下一次点击hanks@ralph.mayr,它现在有点让我不知所措。刚开始学习。我一定会更加了解它。同时,我删除了
wait.until,并使用了if语句,它似乎工作得更好一些。遇到了一个新的麻烦,每2-3次点击就会出现一个表单。正在尝试发布,但90分钟内无法发布。谢谢@ralph.mayr,现在我有点不知所措。刚开始学习。我一定会更加了解它。同时,我删除了
wait.until,并使用了if语句,它似乎工作得更好一些。遇到了一个新的麻烦,每2-3次点击就会出现一个表单。试图发布,但90分钟内无法发布。