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
当我 运行 我的代码时:
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