【问题标题】:Do I always have to wait before clicking?在点击之前我总是需要等待吗?
【发布时间】:2013-09-04 16:56:48
【问题描述】:

我正在使用 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)

但我不想在每个.setValue().click().getText() 或任何其他API command 之前都抛出一个waitFor。我错过了什么吗?

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

【问题讨论】:

  • .click "will" 在对元素进行操作之前隐式等待页面加载。这个元素是否通过 ajax 附加到 DOM 中?
  • @sircapsalot:不,它在页面加载时的 Ctrl+U 页面源中。
  • 可能是本次讨论中的第二条评论 (groups.google.com/forum/#!topic/webdriver/8n55XfpDSGo) 会有所帮助。仅供参考,在 selenium webdriver 的 Java、Python、Ruby 绑定中有一个 implicitWait 实现。
  • @Amey 并没有真正帮助他,因为他正在使用 webdriverjs :)
  • @mpen 对于初学者来说,隐式等待不是最佳实践,而且它们在网络自动化场景中不受欢迎。没有理由不使用显式等待。我知道你的问题需要一种隐式等待方法,但相信我,在做了数百小时的这些事情之后,如果你想在回归运行时晚上睡个好觉,你会想要做一些明确的等待你的每个命令.明天我会添加一个答案(现在需要一些 ZZzzZZ)。另外,我们可以对这个公认的答案做些什么吗? :) 与它的相关性为 0。

标签: javascript selenium-webdriver webdriver-io


【解决方案1】:

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

【讨论】:

【解决方案2】:

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

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

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

显然这是一个 c# 示例,但希望你能翻译它。

我认为这是一个 webdriverjs 示例:

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

【讨论】:

  • webdriverjs.manage 不幸的是不存在。在源代码中也找不到对implicitlyWait 的任何引用:-(
  • 当我看这里时:docs.seleniumhq.org/docs/… - 我在这里找到了有关 implictlywaits 默认为 0 的信息。不知道为什么文档与代码不一致。
  • 这实际上不是关于 webdriver-io 的答案。
【解决方案3】:

看起来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 魔术来覆盖这个方法。

【讨论】:

  • 我认为这是一个与我正在使用的库不同的库......尽管如果那个库更好,现在切换还为时不晚。
  • 你说得对……这实际上是 seleniums 官方的 JavaScript API。如果你能弄清楚我的第一种方法会起作用:)
  • 是的,在你发布之前我想出了这个:client.addCommand('waitClick', function(selector, ms) { return this.waitFor(selector, ms || 1000, function(err) { expect(err, selector).to.be.null; }).click(selector); });(它也挂在 mocha/chai 测试中)......这还不错,但图书馆似乎还有其他一些问题也。现在尝试官方的....文档很糟糕。
  • 谷歌代码......太糟糕了
  • @Mark 您在使用 WebdriverJS 时还有哪些其他问题?是的,您使用addCommand 的方法将是可行的方法。您还可以将回调传递给自定义函数,它的行为类似于 click
猜你喜欢
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-17
  • 2021-09-25
  • 2018-03-26
  • 1970-01-01
相关资源
最近更新 更多