无法使用 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
value 为 1 但 php, c#、python 和 java
解决方案
您可以使用以下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 网站检索标签内容