【问题标题】:default_wait_time for Intern Selenium tests实习生 Selenium 测试的 default_wait_time
【发布时间】:2014-09-24 05:53:54
【问题描述】:

实习生是否有与 Capybara (RoR) default_wait_time 等效的方法?

setPageLoadTimeout 和 setFindTimeout 似乎没有完成任何事情。

this.timeout = 60000 似乎给整个测试 60 秒,但我希望所有步骤都有默认等待时间。否则,它会感觉步骤乱序,因为步骤所依赖的元素尚未出现在页面上。

        var title = 'title ' + (new Date()).toString();
        var remote = this.remote;
        return remote
            .get(require.toUrl('http://' + Configs.host + '/logout'))
            .get(require.toUrl('http://' + Configs.host + '/auth/facebook'))
            .findById('email')
                .click()
                .type(Configs.fb.username)
                .end()
            .findById('pass')
                .click()
                .type(Configs.fb.password)
                .end()
            .findByCssSelector('#login_form input[type=submit]')
                .click()
                .end()
            // browser successfully navigates to "/things"
            .findByCssSelector('a.new_thing')
                .click()
                .end()
        // browser often navigates to "/things/new"
            .findByCssSelector('input.title')
        // terminal message always 'StaleElementReference'
        // even though a pollUntil (ommitted) does find 'input.title'
                .click()
                .type(title)
                .end()
            .findByCssSelector('button.create')
                .click()
                .end()

还有其他人可靠地将这个框架用于单页网络应用程序吗?

【问题讨论】:

  • 能否请您显示一些代码,例如您正在编写的测试用例? setFindTimeout 绝对是一回事。
  • 我已经用测试代码示例更新了我的问题。我在代码中有 cmets。我正在使用 html5 pushState,浏览器地址栏导航到完整的 URL,但它们实际上只是到客户端 Backbone.js 路由器路径的映射。

标签: node.js selenium-webdriver requirejs selenium-chromedriver intern


【解决方案1】:

setFindTimeout 设置在超时之前尝试查找元素时远程服务器将等待元素出现的时间量。如果不能保证元素立即存在于页面上,则应在加载页面后调用setFindTimeout

return this.remote.get('http://example.com')
  .setFindTimeout(5000)
  .findById('email')
    .click()
    .type(Configs.fb.username)
    .end()
  .findById('pass')
    .click()
    .type(Configs.fb.password)
    .end()
  // ...

请注意,某些 Selenium 服务器会在加载新页面后重置等待超时,因此您可能需要在加载新页面时再次调用它。

【讨论】:

  • 我在您建议的地方添加了它,但它不起作用。我的测试失败的地方是 findByCssSelector('a.new_thing').click().end() 之后。即使 pollUntil 调用 document.getQuerySelector('input.thing') 得到一个元素,我也会得到“StaleElementReference”,并且我可以在浏览器上看到输入字段。
  • 实际上,我认为这是因为我在我的代码中做了一个 .html('') 来清除一部分内容,并且运行器代码有一个旧引用 localhost:4444/wd/hub/session/… 哪个不再作为元素 12 存在,因为之前的元素已被擦除。
  • 如果在 n*1000 毫秒后重试就好了。
  • .sleep() 似乎有很大帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-21
  • 2016-02-11
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多