Selenium Webdriver - 如何在单击后跳过等待页面加载并继续

时间:2011-03-04 01:18:57

标签: ruby selenium rspec webdriver

我有一个使用webdriver点击按钮的rspec测试...点击按钮后,页面永远不会完全加载(这是预期和正确的行为)。单击按钮后,我想等待2秒,然后导航到另一个URL ...尽管页面尚未加载。我不想抛出错误,因为页面没有加载,我想忽略它,并继续,好像一切都很好。页面永远不应该加载,这是预期和正确的行为。

我怎样才能避免等到超时,其次,我怎么能没有抛出让测试失败的错误。

谢谢!

5 个答案:

答案 0 :(得分:1)

我遇到了类似的问题,我尝试了@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的回答,由于字符有限,我无法将其添加为注释,因此将其添加为单独的答案。

答案 1 :(得分:0)

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秒钟并继续

答案 2 :(得分:0)

为什么不尝试在waitForPageToLoad()之后使用“waiting()”的简单技巧,这使得它忽略了Selenium中的上一个命令并且从未失败过该步骤

答案 3 :(得分:0)

如果您使用RSpec的expect方法会怎样:

expect {
  Thread.new() {
    sleep(2)
    raise RuntimeError
  }
  theButton.click()
}.to raise_error

答案 4 :(得分:0)

将“Enter”键发送到有问题的链接或按钮而不是点击,webdriver将不会等待页面加载并立即返回(这是在C#中,只是转换为Ruby):

element.SendKeys(键,返回);