Определение html-элемента для выбора в ruby, где все искатели совпадают - PullRequest
1 голос
/ 10 июля 2019

Я использую watir-webdriver в проекте ruby ​​для имитации действий пользователя в бизнес-системе.Чтобы выполнить задачу, мне нужно выбрать раскрывающееся поле, а затем выбрать один из вариантов.

Код, в котором отображаются элементы параметров:

<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>

Примечание. Я могу различать параметры, используя "описание" в коде.Однако я не могу использовать какие-либо средства поиска (например, class: / id: и т. Д. Для их идентификации в ruby.)

Существует ли выражение, в котором я могу идентифицировать описательный текст в конце?

Ранее я пытался использовать функцию send_keys, чтобы выбрать их, используя их заголовок, однако поле доступно только для чтения и не отвечает на send_keys.

Мой текущий (не функционирующий) код рубина выглядит следующим образом:

@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'

Ответы [ 3 ]

0 голосов
/ 10 июля 2019

Существует несколько проблем с поиском li с использованием .input(id: 'ctl00_MainContent_cboDefaultPaymentType_Input').li(class: '"gridcontrolcolumn" > Direct Debit < /li>').click:

  • li обычно не входит в input.
  • Класс li это просто "gridcontrolcolumn" - т.е. без кавычек или другого текста.

Я бы попробовал самое простое:

frame = @browser.iframe(id: 'contentIFrame1').iframe(id: 'navLink{bd27b00e-3d5e-b7b5-0ddb-864216077292}AreaFrame')
frame.li(text: 'Direct Debit').click

Это на самом деле вернет внешний li, чего должно быть достаточно.Если вам действительно нужен внутренний li, попробуйте:

frame.li(text: 'Direct Debit', class: 'gridcontrolcolumn').click
0 голосов
/ 10 июля 2019

Во-первых, посмотрите, можете ли вы обновить до последней версии Watir 6.x, если вы еще этого не сделали, поскольку watir-webdriver устарела.

Локатор :class представляет собой один класс (или массив из нескольких классов), поэтому размещение селекторов CSS не будет работать.

У вас есть :text локаторы для String и RegExp:

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

Вы можете прочитать обо всех различных способах размещения элементов Watir здесь: http://watir.com/guides/locating/

0 голосов
/ 10 июля 2019

Замените следующую строку

.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
...