python - 使用 selenium 和 python 从 optgroup 中选择一个选项

标签 python selenium web-crawler

我想从这个 optgroup 中选择一个值,然后它应该给我一个链接下拉列表。

<div class="searchbar">
    <select id="q" multiple="" tabindex="-1" class="select2-hidden-accessible" aria-hidden="true">
    <option></option>
    <option class="q-all-text" value="al:all">Search all text</option>

    <optgroup label="Business Type">
        <option value="bt:Buyer">Buyer</option>
        <option value="bt:Farmer/Rancher">Farmer/Rancher</option>
        <option value="bt:Farmers Market">Farmers Market</option>
        <option value="bt:Fishery">Fishery</option>
        <option value="bt:Food Bank">Food Bank</option>
    </optgroup>

这是迄今为止我的代码:

driver = webdriver.Chrome('/path/to/chromedriver')
driver.get("https://foodmarketmaker.com/main/mmsearch")
iframe = driver.find_element_by_tag_name("iframe")
driver.switch_to.frame(iframe)

select  = Select(driver.find_element_by_class_name("select2-hidden- accessible"))
select.select_by_value("bt:Farmer/Rancher")
links = driver.find_elements_by_tag_name('a')
print(links)
for link in links:
    print(link.get_attribute('href'))

我要么得到一个元素不存在的异常,要么当我通过索引访问时,由于 aria-hidden 属性为 true,我得到一个 ElementNotVisibleException。有什么办法可以解决这个问题吗?

最佳答案

select 不是您需要处理的节点,因为它不可见。

尝试以下代码以获得所需的输出:

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


driver = web.Chrome('/path/to/chromedriver')
driver.get("https://foodmarketmaker.com/main/mmsearch")
iframe = driver.find_element_by_tag_name("iframe")
driver.switch_to.frame(iframe)

wait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//section[@id="search-right"]//input[@placeholder="start typing to search"]'))).click()
wait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//li[.="Bass"]'))).click()

links = wait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, '//section[@id="search-results"]//a[.//*[name()="svg"]]')))

for link in links:
    print(link.get_attribute('href'))

附注您需要将 '//li[.="Bass"]' XPath 中 li 节点的文本值替换为所需选项

关于python - 使用 selenium 和 python 从 optgroup 中选择一个选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50218124/

相关文章:

c# - 如何按顺序运行 selenium C# 测试用例?

python - 使用 scrapyd 运行多个爬虫

python - 如何从整个 DataFrame 中删除或删除第一次出现 `NaN` 后的所有行

python - Tipfy session 管理

ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作?

node.js - 爬取url\如何在node.js中获取动态链接

screen-scraping - Visual Web Scraper 的实现技术是什么?

python - 如何使用 pygame 制作游戏中的命令控制台

python - 从类初始化器内部调用方法是Pythonic吗?

ruby - capybara first() 仅在我添加 :minimum=>1 时有效