我使用单击按钮的 webdriver 进行了 rspec 测试...单击按钮后,页面永远不会完全加载(这是预期的正确行为)。单击按钮后,我想等待 2 秒钟,然后导航到不同的 URL……尽管页面尚未加载。我不想因为页面尚未加载而引发错误,我只想忽略它,并继续前进,就好像一切都很好。页面永远不应该加载,这是预期的正确行为。
我怎样才能避免等到超时,其次,我怎样才能不引发导致测试失败的错误。
谢谢!
WebDriver 有一个阻塞 API,它会一直等待页面被加载。相反,您可以做的是通过 JavaScript 按下按钮,即触发其 onclick 事件。我不熟悉 Ruby,但在 Java 中它会是:
WebDriver driver = ....; // Init WebDriver
WebElement button = ....; // Find your element for clicking
String script = "if (document.createEventObject){"+
"return arguments[0].fireEvent('onclick');"+
"}else{"+
"var evt = arguments[0].ownerDocument.createEvent('MouseEvents');"+
"evt.initMouseEvent('click',true,true,"+
"element.ownerDocument.defaultView,1,0,0,0,0,false,"+
"false,false,false,1,null);"+
"return !element.dispatchEvent(evt);}" ;
((JavascriptExecutor)driver).executeScript(script, button);
在此之后,您可以等待 2 秒钟并继续
我遇到了类似的问题,我尝试了@Sergii提到的这个解决方案,但出现以下错误:
org.openqa.selenium.JavascriptException: javascript error: element is not defined (Session info: chrome=84.0.4147.89)
作为一种解决方法,必须在 java 脚本代码中初始化元素。
String script = "var element = document.querySelector('button[type=submit]');" +
"if (document.createEventObject){"+
"return element.fireEvent('onclick');"+
"}else{"+
"var evt = element.ownerDocument.createEvent('MouseEvents');"+
"evt.initMouseEvent('click',true,true,"+
"element.ownerDocument.defaultView,1,0,0,0,0,false,"+
"false,false,false,1,null);"+
"return !element.dispatchEvent(evt);}" ;
感谢@Sergii 的回答,由于字符有限,我无法将此添加为评论,因此将其添加为单独的答案。
你为什么不尝试一个简单的技巧,在 waitForPageToLoad() 之后使用“waiting()”,它可以忽略 Selenium 中的前一个命令并且永远不会失败该步骤
将“Enter”键发送到相关链接或按钮而不是单击,webdriver 不会等待页面加载并立即返回(这是在 C# 中,只需转换为 Ruby):
element.SendKeys(Key,Return);
如果你使用 RSpec 的 expect 方法会怎样:
expect {
Thread.new() {
sleep(2)
raise RuntimeError
}
theButton.click()
}.to raise_error