2

我正在使用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(),.getText()或任何其他API 命令之前都抛出一个。我错过了什么吗?

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

4

3 回答 3

9

driver.manage().timeouts().implicitlyWait(ms)函数确实存在于WebdriverJS Reference API Docs中。此 API 用于 Selenium 支持的官方 Javascript API,@sircapsalot 的摘录来自。但是,它比查看 Google 代码更清晰,也更易于导航。

于 2014-03-05T18:51:32.050 回答
2

您可以通过以下方式设置隐式等待的持续时间:

Driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(2));

默认设置为 0,这就是 click() 立即触发的原因。

显然这是 ac# 的例子,但希望你能翻译它。

我认为这是一个 webdriverjs 示例:

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
于 2013-09-04T17:02:29.887 回答
1

看起来 webdriverjs 甚至没有隐式超时,因此,无法更改它。

我能想到的 1 个解决方案是将click()方法重写为类似这样的东西......(请注意,这是假的。)

click = function(what) {
  waitFor(what);
  super(what);
}

这是一个显式等待,但我们可以认为它是隐式的;)

编辑:我进一步研究了 webdriverjs 的“内部圣地”,我从这里 找到了这段摘录

/**
 * ...
 * @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 魔术来覆盖这个方法。

于 2013-09-04T17:26:28.577 回答