所以我很新,并试图找出在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:消息:
无法理解原因。或者解决它。
答案 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(...)也会超时。
基本上有两种解决方案:
示例:
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?