如何在selenium中通过WebDriver加载页面之前`executeScript`?

时间:2016-05-06 11:58:03

标签: selenium selenium-webdriver webdriver

我想在nodejs中使用webdriver来控制使用ajax非常繁重的网站,特别是它总是对服务器有http请求。

当我使用driver.executeScript时,我发现返回的承诺几乎从未恢复过。

我检查了网站,发现它使用keep-alive http请求循环与服务器通信。这意味着,它将始终与服务器至少有一个30秒的实时连接,然后是另一个30秒的连接,一次又一次。导致document.readyState保持interactive而不是completed,然后driver.executeScript几乎永远被阻止。

我曾尝试过driver.manage().timeouts().pageLoadTimeout(PAGE_LOAD_TIMEOUT_MS),但只会在超时后抛出异常。

我还尝试通过在浏览器窗口按ESC来停止连接。之后,似乎driver.executeScript可以立即运行。但我在WebDriver API中找不到像window.stop()这样的函数。

那么有办法解决这个问题吗?要么就是这样:

  1. 立即运行executeScript 无论 是否已加载页面;
  2. driver.browser.stop()这样的webdriver api可以阻止页面中的所有实时连接。
  3. Nodejs代码重新产生这个问题:

    const WebDriver = require('selenium-webdriver')
    
    const driver = new WebDriver.Builder()
    .withCapabilities(
      WebDriver.Capabilities.firefox()
      .set('webdriver.load.strategy', 'unstable')
    ).build()
    
    driver.get('https://wx.qq.com/')
    
    driver.executeScript('return "99% will be blocked, 1% luck to return"')
    .then(function (ret) {console.log(ret)})
    

    谢谢!

      

    更新:
      我发现在firefox中设置webdriver.load.strategyunstable会有所帮助。

         

    FirefoxProfile fp = new FirefoxProfile(); fp.setPreference("webdriver.load.strategy", "unstable"); WebDriver driver = new FirefoxDriver(fp);

         

    https://github.com/seleniumhq/selenium-google-code-issue-archive/issues/4993   https://w3c.github.io/webdriver/webdriver-spec.html#page-load-strategies-1

    其他人的链接也有同样的问题: http://grokbase.com/t/gg/webdriver/1263dbyws6/how-to-click-stop-button-or-equivalent

2 个答案:

答案 0 :(得分:0)

我认为如果您不使用隐式时间,驱动程序将不会等到它被加载,因此您将能够执行您的脚本。

如果这不起作用,您可以尝试使用自己的计时器。检查doc状态是否准备好,如果在超时后没有准备就绪,然后手动停止(通过JS)并运行脚本。

答案 1 :(得分:-3)

使用Thread.sleep(secs);。例如,我们希望在3秒内加载页面意味着我们编写thread.sleep(30000);