WATIR:link 和 link_element 之间的区别

WATIR: difference between link and link_element

当我 运行 我的代码时:

link_element(:text, "#{user_name}").when_present.click 报错 TypeError: can't convert Symbol into Integer

(这里的user_name是一个变量,它存储的是一个字符串,这个字符串是用户创建的名字运行 time with time stamp)

当我 运行 我的代码 link(:text, "#{content_title}").when_present.click 它给出
NoMethodError: undefined method 'link' for #<ClassName:0x3ded7a0>

这是第 HTML 页:

<div class="univ_name">
  <p class="major_name" title="Thorin Oakenshield 04/05/15">
    <a href="/blabla/bla-bla-qwert-04-05-15-04-09-10-am">Thorin Oakenshield 04/05/15, 04:09:10 AM</a>
  </p>
  <div class="univ-info">
  <div class="univ-meta-data">
</div>

我也试过使用 link(:text, "#{user_name}").parent.paragraph(:class, 'major_name').parent.div(:class, 'univ_name').when_present.click 单击,但没有帮助。

无需字符串插值,当我将 'user_name' 设置为 html 中的 link 文本时,以下代码在本地对我有效:

user_name = "Thorin Oakenshield 04/05/15, 04:09:10 AM"
browser = Watir::Browser.new :chrome
browser.goto "http://127.0.0.1:1234/"
browser.link(:text, user_name).when_present.click

问题

您看到的行为是由于 Watir 和页面对象 API 之间的差异造成的。

第一个区别在于元素的动态定位方式:

  • Watir 使用 link 查找嵌套元素。例如,browser.link(:text => "#{user_name}").click
  • 页面对象 gem 使用 link_element 查找嵌套元素。例如,page.link_element(:text => "#{user_name}").click

由于link只在Watir中定义,并没有在Page-Object中定义,所以page对象会报未定义方法的错误。

第二个区别是如何指定定位器:

  • Watir 允许将定位器指定为散列或两个参数。允许两个参数实际上只是为了向后兼容;通常首选使用哈希。换句话说,Watir 允许 browser.link(:text, "#{user_name}")browser.link(:text => "#{user_name}").
  • Page-Object 仅允许将定位器指定为散列 - 例如 browser.link(:text => "#{user_name}").

由于 link_element 是使用两个参数而不是单个哈希调用的,因此会发生错误。

解决方案

您应该能够通过使用 link_element 方法的散列来解决您的问题:

link_element(:text => "#{user_name}").when_present.click