#python-2.7 #xpath #selenium-webdriver
#python-2.7 #xpath #selenium-webdriver
Вопрос:
У меня есть HTML-таблица с несколькими строками и столбцом на веб-странице. Я пытаюсь записать значение в столбец для каждой строки.
Строка 1 имеет значение STR[wi si 90] LC2[wi si 90]
Строки 2 имеют значение STR[wi si 90] LC3[wi si 90]
Строка 3 имеет значение STR[wi si 90] PCD[maj mpc]
Для каждой строки я хотел бы заменить значение 90 на 98, например. Строка 1 теперь должна быть STR[wi si 98] LC2[wi si 98]
Я пробовал следующий код, но он ничего не делает:
def enter_a_street_rule_from_street_rules_listbox(self, street_rule, new_street_rule): # enter the street rule value so all the street rules have the value 98 from page 13 of the regression test script e.g. STR[wi si 98] LC2[wi si 98]
# Params street_rule : E.g. STR[wi si 90] LC2[wi si 90]
# Params new_street_rule : E.g. STR[wi si 98] LC2[wi si 98]
street_rules_listbox_element = self.get_element(By.XPATH, '//table[@id="data_configuration_add_data_object_tab_address_rules_tb_level_rules_street"]//tr//td//div[contains(text(),"%s")]' % street_rule)
street_rules_listbox_element.send_keys(new_street_rule)
Код для вызова метода:
data_objects_address_rules_tab.enter_a_street_rule_from_street_rules_listbox("STR[wi si 90] LC2[wi si 90]", "STR[wi si 98] LC2[wi si 98]")
Фрагмент HTML:
<table id="data_configuration_add_data_object_tab_address_rules_tb_level_rules_street" class="GFNQNVHJE border" cellspacing="0" __gwtcellbasedwidgetimpldispatchingfocus="true" __gwtcellbasedwidgetimpldispatchingblur="true" style="min-width: 350px;">
<thead aria-hidden="false">
<colgroup>
<tbody>
<tr class="GFNQNVHCD" __gwt_subrow="0" __gwt_row="0">
<td class="GFNQNVHBD GFNQNVHDD GFNQNVHED">
<td class="GFNQNVHBD GFNQNVHDD GFNQNVHOD">
<div __gwt_cell="cell-gwt-uid-7176" style="outline-style:none;">STR[wi si 90] LC2[wi si 90]</div>
</td>
</tr>
<tr class="GFNQNVHCE" __gwt_subrow="0" __gwt_row="1">
<tr class="GFNQNVHCD" __gwt_subrow="0" __gwt_row="2">
<td class="GFNQNVHBD GFNQNVHDD GFNQNVHED">
<td class="GFNQNVHBD GFNQNVHDD GFNQNVHOD">
<div __gwt_cell="cell-gwt-uid-7176" style="outline-style:none;">STR[wi si 90] PCD[maj mpc]</div>
</td>
</tr>
</tbody>
<tbody style="display: none;">
<tfoot style="display: none;" aria-hidden="true"/>
</table>
Я могу использовать следующий XPATH для идентификации элемента:
By.XPATH, '//table[@id="data_configuration_add_data_object_tab_address_rules_tb_level_rules_street"]//tr//td//div[contains(text(),"%s")]' % street_rule
Как мне заменить значение 90 на 98 для каждой строки?
Спасибо, Риаз
Теперь у меня это работает. Я нашел альтернативный способ, который заключался в том, чтобы нажать кнопку добавить в графическом интерфейсе. Я заметил, что в HTML появляется входной тег. Я нашел элемент ввода, а затем использовал send_keys для ввода значения в поле ввода.
Код для поиска входного тега и ввода значения:
def enter_a_street_rule_in_street_rules_listbox(self, new_street_rule):
# Params new_street_rule : E.g. STR[wi si 98] LC2[wi si 98]
street_rules_listbox_element = self.get_element(By.XPATH, '//table[@id="data_configuration_add_data_object_tab_address_rules_tb_level_rules_street"]//tr//td//div//input[@value="Enter rule"]')
street_rules_listbox_element.send_keys(new_street_rule)
XPATH для поиска элемента:
'//table[@id="data_configuration_add_data_object_tab_address_rules_tb_level_rules_street"]//tr//td//div//input[@value="Enter rule"]'
Вызывающий код для вызова метода:
data_objects_address_rules_tab.click_add_button()
data_objects_address_rules_tab.enter_a_street_rule_in_street_rules_listbox("STR[wi si 98] LC2[wi si 98]")
Комментарии:
1. sendkeys работает только с тегами ввода, такими как textbox, textarea. Вам нужно использовать javascript для изменения html в div с помощью функции innerhtml..
2. Спасибо, я нашел альтернативный способ сделать это. Я могу нажать кнопку добавить в графическом интерфейсе, и в таблице HTML появится входной тег. Я использовал send_keys для ввода значения в поле ввода. Я помещу свой код в нижней части моего вопроса
Ответ №1:
.send_keys()
работает только для элементов, которые принимают ввод с клавиатуры. Я не думаю, что это тот случай. Вы говорите об изменении HTML страницы. Это можно сделать, но это только временно. Как только страница (или этот раздел страницы) будет перезагружена, изменения будут потеряны.
Если вы все еще хотите это сделать, вы можете использовать JavascriptExecutor
и установить .innerHTML
значение "STR[wi si 98] LC2[wi si 98]"
или что угодно еще.
Комментарии:
1. Если я введу значения в таблицу html на веб-странице, я могу нажать кнопку сохранить, чтобы сохранить изменения. На странице есть кнопка сохранения
2. Альтернативный вариант, который я могу сделать, это установить все флажки из таблицы html на странице и удалить правила уличного движения. Затем я могу нажать кнопку добавить и добавить новое правило улицы. Поле ввода появляется в таблице HTML, когда я нажимаю кнопку Добавить
3. Если это так, вам не нужно устанавливать значение
.innerHTML
на странице. Вы должны написать сценарий, как пользователь будет обновлять таблицу на странице. Я не могу сказать вам, что это такое, поскольку я его не видел.