在查找器全部匹配的 ruby 中识别要选择的 html 元素
Identifying a html element for selection in ruby where finders all match
我在 ruby 项目中使用 watir-webdriver 来模拟用户在业务系统上的操作。为了执行该任务,我需要 select 一个下拉字段,然后 select 从中选择一个选项。
显示选项元素的代码是:
<ul class="rcbList" style="list-style:none;margin:0;padding:0;zoom:1;">
<li class="rcbHovered rcbTemplate">
<ul>
<li style="width: 100%" class="gridcontrolcolumn">
Direct Debit
</li>
</ul>
</li>
<li class="rcbItem rcbTemplate">
<ul>
<li style="width: 100%" class="gridcontrolcolumn">
Invoice
</li>
</ul>
</li>
<li class="rcbItem rcbTemplate">
<ul>
<li style="width: 100%" class="gridcontrolcolumn">
Online Payment
</li>
</ul>
</li>
</ul>
注意我可以在代码中使用 "description" 来区分选项。但是,我无法使用任何查找器(例如 class:/id: 等在 ruby 中识别它们)
有没有可以识别结尾描述文字的表达方式?
我之前曾尝试使用 send_keys 函数来 select 他们使用他们的标题,但是该字段是只读的并且不响应 send_keys.
我当前的(非功能)ruby代码如下:
@browser.iframe(id: 'contentIFrame1')
.iframe(id: 'navLink{bd27b00e-3d5e-b7b5-0ddb-864216077292}AreaFrame')
.input(id: 'ctl00_MainContent_cboDefaultPaymentType_Input').wait_until_present.click
@browser.iframe(id: 'contentIFrame1')
.iframe(id: 'navLink{bd27b00e-3d5e-b7b5-0ddb-864216077292}AreaFrame')
.input(id: 'ctl00_MainContent_cboDefaultPaymentType_Input').li(class: '"gridcontrolcolumn" >
Direct Debit < /li>').click
当然,如果我使用 .li(class:"gridcontrolcolumn").click
,我返回的值太多了。
Watir::Exception::UnknownObjectException: timed out after 30 seconds, waiting for #<Watir::LI: located: false; {:id=>"contentIFrame1", :tag_name=>"iframe"} --> {:id=>"navLink{bd27b00e-3d5e-b7b5-0ddb-864216077292}AreaFrame", :tag_name=>"iframe"} --> {:id=>"ctl00_MainContent_cboDefaultPaymentType_Input", :tag_name=>"input"} --> {:class=>"\"gridcontrolcolumn\" >\n Direct Debit < /li>", :tag_name=>"li"}> to be located
./features/step_definitions/create_DD_mandate.rb:65:in `/^Change the payment type to DD$/'
./features/create_DD_contact.feature:13:in `Then Change the payment type to DD'
替换下面一行
.input(id: 'ctl00_MainContent_cboDefaultPaymentType_Input').li(class: '"gridcontrolcolumn" >
Direct Debit < /li>').click
有了这个
.li(xpath: "//ul[@class='rcbList']//li[@class='gridcontrolcolumn'][normalize-space(.)='Invoice']").click
使用 .input(id: 'ctl00_MainContent_cboDefaultPaymentType_Input').li(class: '"gridcontrolcolumn" > Direct Debit < /li>').click
:
定位 li
似乎存在一些问题
li
通常不在 input
中。
li
class 只是 "gridcontrolcolumn" - 即没有引用或其他文本。
我会尝试最简单的:
frame = @browser.iframe(id: 'contentIFrame1').iframe(id: 'navLink{bd27b00e-3d5e-b7b5-0ddb-864216077292}AreaFrame')
frame.li(text: 'Direct Debit').click
这实际上将 return 外部 li
,这应该足够了。如果你真的需要内部 li
,试试:
frame.li(text: 'Direct Debit', class: 'gridcontrolcolumn').click
首先,看看您是否可以升级到最新版本的 Watir 6.x 如果您还没有,因为 watir-webdriver 已被弃用。
:class
定位器是单个 class(或多个 class 的数组),因此放入 CSS 选择器将不起作用。
String
和 RegExp
都有 :text
个定位器:
.li(text: 'Direct Debit')
.li(text: /Payment/)
您可以在此处阅读有关定位 Watir 元素的所有各种方法:
http://watir.com/guides/locating/
我在 ruby 项目中使用 watir-webdriver 来模拟用户在业务系统上的操作。为了执行该任务,我需要 select 一个下拉字段,然后 select 从中选择一个选项。
显示选项元素的代码是:
<ul class="rcbList" style="list-style:none;margin:0;padding:0;zoom:1;">
<li class="rcbHovered rcbTemplate">
<ul>
<li style="width: 100%" class="gridcontrolcolumn">
Direct Debit
</li>
</ul>
</li>
<li class="rcbItem rcbTemplate">
<ul>
<li style="width: 100%" class="gridcontrolcolumn">
Invoice
</li>
</ul>
</li>
<li class="rcbItem rcbTemplate">
<ul>
<li style="width: 100%" class="gridcontrolcolumn">
Online Payment
</li>
</ul>
</li>
</ul>
注意我可以在代码中使用 "description" 来区分选项。但是,我无法使用任何查找器(例如 class:/id: 等在 ruby 中识别它们)
有没有可以识别结尾描述文字的表达方式?
我之前曾尝试使用 send_keys 函数来 select 他们使用他们的标题,但是该字段是只读的并且不响应 send_keys.
我当前的(非功能)ruby代码如下:
@browser.iframe(id: 'contentIFrame1')
.iframe(id: 'navLink{bd27b00e-3d5e-b7b5-0ddb-864216077292}AreaFrame')
.input(id: 'ctl00_MainContent_cboDefaultPaymentType_Input').wait_until_present.click
@browser.iframe(id: 'contentIFrame1')
.iframe(id: 'navLink{bd27b00e-3d5e-b7b5-0ddb-864216077292}AreaFrame')
.input(id: 'ctl00_MainContent_cboDefaultPaymentType_Input').li(class: '"gridcontrolcolumn" >
Direct Debit < /li>').click
当然,如果我使用 .li(class:"gridcontrolcolumn").click
,我返回的值太多了。
Watir::Exception::UnknownObjectException: timed out after 30 seconds, waiting for #<Watir::LI: located: false; {:id=>"contentIFrame1", :tag_name=>"iframe"} --> {:id=>"navLink{bd27b00e-3d5e-b7b5-0ddb-864216077292}AreaFrame", :tag_name=>"iframe"} --> {:id=>"ctl00_MainContent_cboDefaultPaymentType_Input", :tag_name=>"input"} --> {:class=>"\"gridcontrolcolumn\" >\n Direct Debit < /li>", :tag_name=>"li"}> to be located
./features/step_definitions/create_DD_mandate.rb:65:in `/^Change the payment type to DD$/'
./features/create_DD_contact.feature:13:in `Then Change the payment type to DD'
替换下面一行
.input(id: 'ctl00_MainContent_cboDefaultPaymentType_Input').li(class: '"gridcontrolcolumn" >
Direct Debit < /li>').click
有了这个
.li(xpath: "//ul[@class='rcbList']//li[@class='gridcontrolcolumn'][normalize-space(.)='Invoice']").click
使用 .input(id: 'ctl00_MainContent_cboDefaultPaymentType_Input').li(class: '"gridcontrolcolumn" > Direct Debit < /li>').click
:
li
似乎存在一些问题
li
通常不在input
中。li
class 只是 "gridcontrolcolumn" - 即没有引用或其他文本。
我会尝试最简单的:
frame = @browser.iframe(id: 'contentIFrame1').iframe(id: 'navLink{bd27b00e-3d5e-b7b5-0ddb-864216077292}AreaFrame')
frame.li(text: 'Direct Debit').click
这实际上将 return 外部 li
,这应该足够了。如果你真的需要内部 li
,试试:
frame.li(text: 'Direct Debit', class: 'gridcontrolcolumn').click
首先,看看您是否可以升级到最新版本的 Watir 6.x 如果您还没有,因为 watir-webdriver 已被弃用。
:class
定位器是单个 class(或多个 class 的数组),因此放入 CSS 选择器将不起作用。
String
和 RegExp
都有 :text
个定位器:
.li(text: 'Direct Debit')
.li(text: /Payment/)
您可以在此处阅读有关定位 Watir 元素的所有各种方法: http://watir.com/guides/locating/