Python 同一命令在执行时工作一次,但在第二次执行时引发异常?
所以我是一个新手,正在尝试找出一些在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
<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分钟内无法发布。