WATIR:link和link_element之间的区别

时间:2015-04-04 22:57:50

标签: ruby cucumber watir watir-webdriver page-object-gem

当我用以下代码运行代码时:

link_element(:text, "#{user_name}").when_present.click它给出了错误 TypeError: can't convert Symbol into Integer

(这里user_name是一个变量,它存储一个字符串,这是用户创建的带时间戳的运行时的名称)

当我用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,但没有帮助。

2 个答案:

答案 0 :(得分:2)

<强>问题

您看到的行为是由于Watir和Page-Object API之间的差异。

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

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

由于link仅在Watir中定义而不是Page-Object,因此页面对象将给出未定义的方法错误。

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

  • 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

答案 1 :(得分:0)

不需要字符串插值,当我将'user_name'设置为来自给定html的链接文本时,下面的代码在本地适用于我:

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