如何使用 Selenium-Python 从多选列表中选择多个选项?

Posted

技术标签:

【中文标题】如何使用 Selenium-Python 从多选列表中选择多个选项?【英文标题】:How to select multiple options from multi select list using Selenium-Python? 【发布时间】:2019-06-13 14:31:07 【问题描述】:

我正在尝试从具有 10 个选项的多项选择中选择 P0_ENGLISHP1_ENGLISHP5_ENGLISH。我只想选择这 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>

SELENIUM-Python 代码:

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

【问题讨论】:

试试element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.xpath, title="P0_English")) 【参考方案1】:

要从 Multi Select 元素中选择多个 选项,您可以使用 ActionChains 来模拟 Control Click,如下所示:

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:
For me:

Multi-select option present on Techlistic form site worked by below code when I used CSS Selector-

https://www.techlistic.com/p/selenium-practice-form.html

act=ActionChains(self.drv)
WE_cmd= self.drv.find_element(By.CSS_SELECTOR,'#selenium_commands > option:nth-child(2)' )
opt=Select(self.drv.find_element(By.ID,"selenium_commands"))
opt.select_by_visible_text("Browser Commands")
act.key_down ( Keys.CONTROL ).click ( WE_cmd).key_up ( Keys.CONTROL ).perform ()

【讨论】:

请编辑您的问题,以便格式正确。

以上是关于如何使用 Selenium-Python 从多选列表中选择多个选项?的主要内容,如果未能解决你的问题,请参考以下文章

如何从多选下拉菜单中获取值并将它们与 POST 一起发送?

ExtJS--grid表格前多选列

PL/SQL: INSTR(), SUBSTR(), 如何从多选列表中提取值

php ACF |从多选字段中获取所有选定的选项。

php ACF |从多选字段中获取所有选定的选项。

ElementUI 将table多选框改为单选框的解决办法