我告诉Selenium等到看到元素-Selenium看到它 我告诉Selenium单击此元素,这是链接到新页面的按钮-Selenium单击它。
问题在于,单击它后,Selenium将等待直到下一页完全加载为止(该页面有时会加载一秒钟,或者等待很长时间,我认为该页面上的Zen Desk Live Chat存在问题) 。
完全加载后,它将引发错误并说看不到单击的元素(自然不能,因为它现在在新页面上)
我尝试使用
更改等待时间driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
但这无济于事。 我也尝试过
wait.until(ExpectedConditions.visibilityOfElementLocated(
By.xpath(element)));
但是这有同样的问题。
下面是我当前正在使用的代码。
try {
wait.until(ExpectedConditions.visibilityOfElementLocated(
By.xpath(element)));
WebElement we = driver.findElement(By.xpath(element));
we.click();
System.out.println("Clicked: " + element);
}catch (Exception e){
System.out.println(e.getMessage());
}
我希望一旦元素被单击,Selenium就可以继续进行而不必关心下一页是否已加载。
但是,当第二页加载时会发生什么,有时该页面会卡住“等待widget-mediator.zopim.com”,并且在WebDriverWait时间到期之前,Selenium不会经过click()行(60秒) 60秒过后,我会在控制台输出中看到此错误:
[1561374309.111][SEVERE]: Timed out receiving message from renderer: 60.000
[1561374309.112][SEVERE]: Timed out receiving message from renderer: -0.002
这里还有其他事情吗?还是Click()等待该页面加载,如果该点击将其带到新页面?如果这样做,是否有办法告诉它停止等待?我还有其他代码来检查页面是否已加载,但是我不需要Click()来完成此操作。
谢谢。
答案 0 :(得分:1)
硒(或更准确地说,是WebDriver)的点击行为由W3C WebDriver Specification决定。在该文档中,完整的算法定义为请求元素单击时发生的情况。通常,如果单击将导航到新页面,则驱动程序将根据页面加载策略等待该新页面被“加载”(故意使用恐吓引号),直到页面加载超时。
页面加载策略默认为“正常”,或者等待文档的readyState
完成。如果在驱动程序实例化期间要求的功能中将其设置为“ none”,则驱动程序将完全不等待。选择该路由意味着您将需要处理所有正在加载页面的同步。请注意,还有第三个页面加载策略“渴望”,但是在撰写本文时,并非所有WebDriver实现(最著名的是chromedriver)都支持它。
您可以在运行时使用Selenium代码调整页面加载超时。一种方法可能是在单击此特定元素的持续时间内将超时降低到一个相对较低的值,然后再将其恢复为其先前的值。这样做的缺点是您必须在继续页面加载超时之前捕获超时异常。