在查找器全部匹配的 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 选择器将不起作用。

StringRegExp 都有 :text 个定位器:

.li(text: 'Direct Debit')
.li(text: /Payment/)

您可以在此处阅读有关定位 Watir 元素的所有各种方法: http://watir.com/guides/locating/