点击之前我总是要等吗?

时间:2013-09-04 16:56:48

标签: javascript selenium-webdriver webdriver-io

我正在使用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()。我错过了什么吗?

是否有等待整个页面加载的命令,或者在访问元素之前隐式等待的设置?

3 个答案:

答案 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魔术来覆盖此方法。