5
votes

I have an rspec test using webdriver that clicks on a button... after clicking the button, the page never fully loads (which is expected and correct behaviour). After clicking the button, I want to wait 2 seconds and then navigate to a different URL... despite the fact that the page has not loaded. I don't want to throw an error because the page hasn't loaded, I want to just ignore that, and continue on as if everything is good. The page should never load, that is the expected and correct behaviour.

How can I avoid waiting until the timeout, and secondly, how can I have that not throw an error which casuses the test to fail.

Thank you!

5

5 Answers

1
votes

WebDriver has a blocking API and it will always wait for page to be loaded. What you can do instead, is to press the button via JavaScript, i.e. trigger its onclick event. I am not familiar with Ruby, but in Java it would be:

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);

After this you can wait for 2 seconds and continue

1
votes

I had this similar problem, I tried this solution which @Sergii mentioned but was getting below error:

org.openqa.selenium.JavascriptException: javascript error: element is not defined (Session info: chrome=84.0.4147.89) 

As a workaround had to initialize element within java script code.

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);}" ;

Thank you @Sergii for your answer, I was not able to add this as a comment due to limited characters, so added it as a separate answer.

0
votes

why don't you try a simple trick of using "waiting()" after waitForPageToLoad() which makes it to neglect the previous command in Selenium and never fails that step

0
votes

What if you used RSpec's expect method:

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

Send the 'Enter' key to the link or button in question instead of a click, webdriver won't wait for the page to load and will return instantly (this is in C#, just translate to Ruby):

element.SendKeys(Key,Return);