我想在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()
这样的函数。
那么有办法解决这个问题吗?要么就是这样:
executeScript
无论 是否已加载页面; driver.browser.stop()
这样的webdriver api可以阻止页面中的所有实时连接。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.strategy
到unstable
会有所帮助。
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
答案 0 :(得分:0)
我认为如果您不使用隐式时间,驱动程序将不会等到它被加载,因此您将能够执行您的脚本。
如果这不起作用,您可以尝试使用自己的计时器。检查doc状态是否准备好,如果在超时后没有准备就绪,然后手动停止(通过JS)并运行脚本。
答案 1 :(得分:-3)
使用Thread.sleep(secs);
。例如,我们希望在3秒内加载页面意味着我们编写thread.sleep(30000);
。