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