我正在使用WebdriverIO和Mocha / Chai一起为我的网站编写一些测试,但是当我这样做时:
it('select application', function(done) {
client
.click('.disciplinetext > table:nth-child(7) > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(3) > button:nth-child(1)')
// more stuff
该元素尚不存在(未呈现)。在实际尝试单击元素之前,.click()
是否应该隐式等待页面完成加载?
如果我在它之前拍这条线,它可以正常工作:
.waitFor('.disciplinetext > table:nth-child(7) > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(3) > button:nth-child(1)',1000)
但我不想在每waitFor
,.setValue()
,.click()
或任何其他API command之前抛出.getText()
。我错过了什么吗?
是否有等待整个页面加载的命令,或者在访问元素之前隐式等待的设置?
答案 0 :(得分:9)
driver.manage().timeouts().implicitlyWait(ms)
功能确实存在于WebdriverJS Reference API Docs中。此API适用于Selenium支持的官方Javascript API,@ sircapsalot的摘录来自。但是,它比查看Google代码要清晰得多,而且更容易导航。
答案 1 :(得分:2)
您可以设置隐式等待的持续时间:
Driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(2));
默认设置为0,这就是click()立即触发的原因。
显然这是一个c#示例,但希望你能翻译它。
我认为这是一个webdriverjs的例子:
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
答案 2 :(得分:1)
看起来webdriverjs看起来没有隐含的超时,因此无法改变它。
我能想到的一个解决方案是将click()
方法覆盖为类似的东西......(注意这是假的。)
click = function(what) {
waitFor(what);
super(what);
}
这是一个明确的等待,但我们可以将其视为隐式;)
修改强> 我进一步研究了webdriverjs的“内部密室”,我从here发现了这段摘录
/**
* ...
* @param {number} ms The amount of time to wait, in milliseconds.
* @return {!webdriver.promise.Promise} A promise that will be resolved when the
* implicit wait timeout has been set.
*/
webdriver.WebDriver.Timeouts.prototype.implicitlyWait = function(ms) {
return this.driver_.schedule(
new webdriver.Command(webdriver.CommandName.IMPLICITLY_WAIT).
setParameter('ms', ms < 0 ? 0 : ms),
'WebDriver.manage().timeouts().implicitlyWait(' + ms + ')');
};
尝试使用一些javascript魔术来覆盖此方法。