ожидал одно из [String, Regexp], получил 1: Fixnum (TypeError) в page-object

#ruby #selenium #watir-webdriver #page-object-gem

#ruby #селен #watir-webdriver #страница-объект-драгоценный камень

Вопрос:

Я пытаюсь найти изображение и использую условие if с изображением exists? , а затем выполняю операцию удаления. Если нет, то добавление. При этом я получаю следующую ошибку..

HTML:

 <div class="xicGridViewport">
<table id="patetrnGrid-100228" class="xicGrid xicGridLoaded" cellspacing="0" cellpadding="0">
    <colgroup>
        <thead>
            <tbody>
                <tr id="id328" class=" xicGridRow0">
                    <td>
                        <td>
                            <td>
                                <td>
                                    <td>
                                        <td>
                                            <td style="text-align: center;">
                                                <td style="text-align: center;">
                                                    <a id="cellIconLink2a" href="#" onclick="var wcall=wicketSubmitFormById('form9', '?wicket:interface=:0:form:multiplePatternBuilderGroupBox:patternGroupbox:patetrnGrid:gridCheckGroup:xicGridContainer:xicGrid:rows:3:cells:8:cell:cellIconLink::IActivePageBehaviorListener:0:-1amp;wicket:ignoreIfNotActive=true', 'multiplePatternBuilderGroupBox:patternGroupbox:patetrnGrid:gridCheckGroup:xicGridContainer:xicGrid:rows:3:cells:8:cell:cellIconLink' ,null,null, function() {return Wicket.$$(this)amp;amp;Wicket.$$('form9')}.bind(this));;; return false;">
                                                        <img class="xicIcon xicIconLoaded xicIconDelete" xic:size="S" xic:icon="delete" src="/uit/xicola/2.3/img/spacer.png"> <!-- Here, where i am using if condition -->
                                                    </a>
                                                </td>
                </tr>
            </tbody>
            <tfoot>
</table>
</div>
  

Код:

pattern_builder_page.rb

         class BuilderPage
        include PageObject

        text_field(:area, name: /area/)
        select_list(:load_type, name: /loadType/)
        checkbox(:link_power, name: /linkPower/)
        image(:plus, css: ".xicIcon.xicIconLoaded.xicIconAdd")
        image(:delete_icon, css: ".xicIcon.xicIconLoaded.xicIconDelete")
        button(:delete, text: 'Delete')

        def create_pattern(category, place, destination)
            train_category_element.when_present
            self.train_category = category
            fac_place_element.when_present
            self.fac_place = place
            fac_destination_element.when_present
            self.fac_destination = destination
            wait_element.when_not_visible
            refresh_element.when_present
            refresh
            wait_element.when_not_visible
            if delete_icon_element.exists?
                delete
                yes_element.when_present.click
            end
    end
end
  

Ошибка:

     expected one of [String, Regexp], got 1:Fixnum (TypeError)
      ./lib/pages/pattern_builder_page.rb:22:in `create_pattern'
      ./features/step_definitions/bulk_steps.rb:30:in `/^I select "(.*?)", "(.*?)" and "(.*?)" facility and submit$/'
      featurespattern_builder.feature:11:in `When I select "<category>",
 "<place>" and "<destination>" facility and submit'
  

Комментарии:

1. Исключение кажется довольно ясным — вы передаете число методу, который ожидает строку или регулярное выражение. Если вы попытаетесь создать пример кода, который воспроизводит вашу проблему (поскольку кода здесь недостаточно), проблема станет намного более понятной.

2. Это помогло бы предоставить полную трассировку ошибки в стеке, которая точно показывает, где возникает исключение. Однако, судя по сообщению, оно, скорее всего, исходит от Watir-Webdriver ElementLocator . По сути, одним из значений, которые вы передаете для поиска элемента, является число, которое разрешено только при поиске по :index . Например, у вас есть что-то вроде browser.div(:id => 1).text .

3. Вам все равно нужно показать больше кода. Исключение связано с кодом в определении шага, который мы не видим. Я предполагаю, что он выполняет некоторые действия, связанные с методом BuilderPage create_pattern, но я не вижу, как этот метод будет работать, учитывая, что большинство используемых элементов не определены.

4. Спасибо, Джастин, за предоставление решения во втором комментарии. Я просмотрел весь свой код и в моем общем модуле страницы. Я неправильно определил локатор, т.Е. Вместо (index: 1) того, который я использовал (xpath: 1) . Не могли бы вы добавить второй комментарий в качестве ответа на этот вопрос.

Ответ №1:

Основываясь на сообщении об исключении, оно поступает от Watir-Webdriver ElementLocator:

 VALID_WHATS = [String, Regexp]

def check_type(how, what)
  case how
  when :index
    unless what.kind_of?(Fixnum)
      raise TypeError, "expected Fixnum, got #{what.inspect}:#{what.class}"
    end
  else
    unless VALID_WHATS.any? { |t| what.kind_of? t }
      raise TypeError, "expected one of #{VALID_WHATS.inspect}, got #{what.inspect}:#{what.class}"
    end
  end
end
  

Этот метод показывает, что значения локатора могут быть только числовыми для :index локаторов.

Это означает, что в одном из ваших локаторов вы передаете число для локатора, которого нет :index . Например, у вас есть:

 # An invalid accessor:
div(:field_name, :id => 1)

# Or what is ultimately called by Watir-Webdriver:
browser.div(:id => 1).text
  

Согласно комментариям, вместо locator был xpath: 1 index: 1 locator .