无法使用 Selenium 和 Python 从 <select> 中选择任何 <options>

Posted

技术标签:

【中文标题】无法使用 Selenium 和 Python 从 <select> 中选择任何 <options>【英文标题】:Not able to select any of the <options> from <select>using Selenium and Python 【发布时间】:2022-01-17 09:35:57 【问题描述】:

According to this tutorial

我应该使用这个:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import Select

with open("sel_path.txt") as path:
    s = path.read()

serv = Service(s)
driver = webdriver.Chrome(service=serv)
driver.get("https://pynishant.github.io/dropdown-selenium-python-select.html")

lang = driver.find_element(By.ID, "lang1")
select = Select(lang)
select.select_by_value("1")

但我收到此错误:

selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable: Element is not currently visible and may not be manipulated

我认为它不起作用,因为元素在 usr 单击框后显示,但我不知道如何解决这个问题以使用 Selenium 选择元素

最终我试图定位到这个box。

我不知道是不是因为旧的 Selenium 语法被弃用了......

任何帮助将不胜感激。

【问题讨论】:

如果你可以包含你想要定位的元素的 html,我也可以展示它。 【参考方案1】:

因为下拉 HTML 是:

<div class="select-items">
   <div>php</div>
   <div>Python</div>
   <div>Java</div>
   <div>C#</div>
</div>

所以你不能使用select。

改为:

serv = Service(s)
driver = webdriver.Chrome(service=serv)
wait = WebDriverWait(driver, 30)
driver.maximize_window()
driver.get("https://pynishant.github.io/dropdown-selenium-python-select.html")

wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.select-selected"))).click()
drop_down_list = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div.select-items div")))

desired_option_to_select = 'PHP'
for option in drop_down_list:
    if option.text == desired_option_to_select:
        option.click()
        print('Clicked ', desired_option_to_select, 'option')
        break
    else:
        print('Could not click')

进口:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

【讨论】:

//div[@class='select-items']/div[.='PHP'] 对于 xpath 会更好。 @ArundeepChohan:我正在使用css,我相信它比 xpath 更好。同意吗? 用php而不是循环来定位div标签。 是的,这将是另一种方式。【参考方案2】:

你已经够近了。不过有几点:

测试语言部分

它不是 SELECT 标签,所以你不能使用Select()

解决方案

要从下拉列表中选择PHP,您可以使用以下Locator Strategies:

代码块:

driver.get("https://pynishant.github.io/dropdown-selenium-python-select.html")
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='select-selected']"))).click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='select-items']/div[text()='PHP']"))).click()

注意:您必须添加以下导入:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

浏览器快照:


选择您的语言部分

SELECT 标记的 id 属性为 lang 而不是 lang1。所以有效的代码行将是:

lang = driver.find_element(By.ID, "lang")

没有option value1php, c#pythonjava

解决方案

您可以使用以下Locator Strategies:

代码块:

driver.get("https://pynishant.github.io/dropdown-selenium-python-select.html")
Select(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//select[@id='lang']")))).select_by_value("php")

注意:您必须添加以下导入:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import Select

浏览器快照:

【讨论】:

以上是关于无法使用 Selenium 和 Python 从 <select> 中选择任何 <options>的主要内容,如果未能解决你的问题,请参考以下文章

无法从 AWS 机器上的 python 中的 selenium 调用 firefox

Python & BeautifulSoup 4/Selenium - 无法从 kicksusa.com 获取数据?

如何使用 Python 和 Selenium 进行分页抓取页面

Python Selenium 无法从 mpob 网站检索标签内容

Selenium / Python:无法使用任何find_element_by_ *方法查找元素

无法使用 Selenium 和 Chrome 获取元素文本