【问题标题】:why must I sleep or wait using watir-webdriver and firefox?为什么我必须使用 watir-webdriver 和 firefox 睡觉或等待?
【发布时间】:2011-09-15 00:40:15
【问题描述】:

好吧,我想评论 watir-webdriver 等待页面加载>这个话题,但因为我有 1 个代表,所以我不能。

我正在将我的 watir 脚本升级到 watir-webdriver,我在 Firefox 上运行的第一个测试产生了结果:

Selenium::WebDriver::Error::NoSuchElementError: Unable to locate element: {"method":"tag name","selector":"body"}

当我所做的只是登录我的应用程序(运行良好),点击构建信息链接,然后执行以下操作:

@browser.text

这种情况一直发生。读完这里之后,我在点击之后和@browser.text 之前睡觉,它起作用了。我的结论显然是 Firefox 驱动程序不会等到页面加载后才尝试

-> POST session/8607aaa2-d72d-448a-85e1-3f96a1766da1/element
{"value":"body","using":"tag name"}

所以我的问题是这是一个孤立的事件(调用@browser.body,这不是一个完全典型的调用)还是我必须使用等待?如果我不能指望驱动程序等到浏览器处于就绪状态,那么似乎 watir 的全部美感就消失了。另外,watir-webdriver 是否有一个开发谷歌组或类似的东西?我感觉我会看到越来越多的问题(IE9 中的几个)。我可能还会在 Alister 的博客上提问(顺便说一句,这很有趣)。

【问题讨论】:

  • 您使用的是什么版本的 watir-webdriver 和 selenium-webdriver gem?
  • 我会尝试安装 selenium-webdriver 2.4.0 看看你是否有同样的问题
  • 应该包含该信息:ruby 1.8.7 p352、selenium-webdriver (2.5.0) watir (2.0.1) watir-webdriver (0.3.3)

标签: firefox watir webdriver watir-webdriver


【解决方案1】:

Watir-WebDriver 应该等到页面准备好,但问题是动态生成的内容太多,真的没有一个明确的准备好定义。

这是等待辅助方法的亮点:http://watirwebdriver.com/waiting/

找到一个你知道你期望的元素,然后使用类似的东西:

require 'watir-webdriver'
b = Watir::Browser.start 'bit.ly/watir-webdriver-demo'
b.select_list(:id => 'entry_1').wait_until_present

更新:

我认为您的问题与本机事件有关。尝试禁用原生事件

profile = Selenium::WebDriver::Firefox::Profile.new
profile.native_events = false
b = Watir::Browser.new WEB_DRIVER, :profile => profile

【讨论】:

  • 我们的应用程序使用了大量的 ajax,并且经常(痛苦地)清楚地看到某些内容异步到达客户端。自从使用 watir 1.6.2 以来,我已经考虑到了这一点,但在这个例子中,我 95% 确定内容是静态的。我不想在任何地方都添加等待(这是我几年前选择 watir 而不是 sel 的原因),但为了避免这种情况,我必须在我的“watir wrapper”层中添加它们,而且这似乎是合适的策略,那么 selenium 开发人员将为曾经访问过的每个对象内置 wait_until_present ...
  • 尝试禁用原生事件。它为我解决了问题
  • 幸运的是我已经有一个 WatirUtil 层来包装我所有的 watir 调用,所以我基本上只是修改了它,现在我将所有东西都包装在一个救援块中,它会尝试 N 秒来点击、设置、清除、等等我真的很讨厌这个。如果我没有实现这一层,我将无法使用 WW 并且必须返回到 watir,它在 99.9% 的时间里都能完美运行。我很欣赏本地事件的评论,但根据你的博客,我已经设置了......
  • 我刚刚发现使用 selenium::webdriver 可以创建/增加隐式等待。对于 watir-webdriver 来说,这将是一件好事:driver.manage.timeouts.implicitlyWait(90);
  • 您可以在 watir-webdriver 中使用我们所说的相同方法:browser.driver.manage.timeouts.implicit_wait = 20
猜你喜欢
  • 2012-01-29
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
相关资源
最近更新 更多