Как выбрать несколько вариантов из элемента множественного выбора, используя Selenium-Python? - PullRequest
0 голосов
/ 19 января 2019

Я пытаюсь выбрать P0_ENGLISH, P1_ENGLISH, P5_ENGLISH из множественного выбора, который имеет 10 вариантов.Я хочу выбрать только эти 3 варианта.

КОД HTML:

<select multiple="" class="gwt-ListBox" style="height: 80px; width: 205px;">
    <option title="Generic_Eng" value="Generic_Eng">Generic_Eng</option>
    <option title="Generic_Hindi" value="Generic_Hindi">Generic_Hindi</option>
    <option title="P0_English" value="P0_English">P0_English</option>
    <option title="P0_Hindi" value="P0_Hindi">P0_Hindi</option>
    <option title="P1_English" value="P1_English">P1_English</option>
    <option title="P1_Hindi" value="P1_Hindi">P1_Hindi</option>
    <option title="P4_English" value="P4_English">P4_English</option>
    <option title="P4_Hindi" value="P4_Hindi">P4_Hindi</option>
    <option title="P5_English" value="P5_English">P5_English</option>
    <option title="P5_Hindi" value="P5_Hindi">P5_Hindi</option>
</select>

КОД СЕЛЕНА-ПИТОНА:

queues = Select(driver.find_element_by_css_selector(".rowStyle1:nth-child(6) .gwt-ListBox"))
queues.select_by_visible_text("P0_English")
time.sleep(3)
queues.select_by_visible_text("P1_English")
time.sleep(3)
queues.select_by_visible_text("P5_English"

Я пытался использовать этот код.С помощью этого кода я могу выбрать первый вариант, то есть «P0_ENGLISH».Однако после выбора первой опции я получаю сообщение об ошибке:

selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document

Ответы [ 3 ]

0 голосов
/ 20 января 2019

Чтобы выбрать несколько вариантов из Multi Select элемента, который вы можете использовать ActionChains , чтобы высмеивать Control Нажмите следующим образом:

from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys

myElemA = driver.find_element_by_css_selector(".rowStyle1:nth-child(6) .gwt-ListBox option[value='P0_English']")
myElemB = driver.find_element_by_css_selector(".rowStyle1:nth-child(6) .gwt-ListBox option[value='P1_English']")
myElemC = driver.find_element_by_css_selector(".rowStyle1:nth-child(6) .gwt-ListBox option[value='P5_English']")
ActionChains(driver).key_down(Keys.CONTROL).click(myElemA).key_up(Keys.CONTROL).perform()
ActionChains(driver).key_down(Keys.CONTROL).click(myElemB).key_up(Keys.CONTROL).perform()
ActionChains(driver).key_down(Keys.CONTROL).click(myElemC).key_up(Keys.CONTROL).perform()
0 голосов
/ 28 апреля 2019

Операция OP предназначена для выбора части элементов в списке множественного выбора, но если вы хотите выбрать все элементы в списке, то здесь есть варианты.

JavaScript:

elements = driver.find_elements_by_css_selector(".gwt-ListBox option")
driver.execute_script("arguments[0].forEach(function(ele){ele.selected=true;});",elements)

Pyhton

elements = driver.find_elements_by_css_selector(".gwt-ListBox option")
for ele in elements:
    # select the item here
0 голосов
/ 19 января 2019

В контексте Selenium ссылка равна stale , когда ссылка недействительна, поскольку указанный элемент был удален или устарел, так как элемент был отсоединен и затем присоединен клиентским скриптом , Не зная точной механики клиентского скрипта, возможны разные решения. Проще всего попытаться снова сослаться на элемент, т. Е.

queues = Select(driver.find_element_by_css_selector(".rowStyle1:nth-child(6).gwtListBox"))
queues.select_by_visible_text("P0_English")
time.sleep(3)
queues = Select(driver.find_element_by_css_selector(".rowStyle1:nth-child(6).gwtListBox"))
queues.select_by_visible_text("P1_English")
time.sleep(3)
queues = Select(driver.find_element_by_css_selector(".rowStyle1:nth-child(6).gwtListBox"))
queues.select_by_visible_text("P5_English")

Предполагается, что селектор CSS остается прежним после повторного присоединения списка выбора. Также существует вероятность того, что селектор станет недействительным, поскольку элемент был удален или его местоположение было изменено. В первом случае вы захотите вызвать исключение и обработать его соответствующим образом, а во втором - выяснить, каким будет его новый селектор, либо эмпирически, либо с помощью анализа кода скрипта на стороне клиента. Подробнее об исключении StaleElementReferenceException здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...