从带有 selenium 和 python 的 optgroup 中选择一个选项 [英] Selecting an option from an optgroup with selenium and python

查看:52
本文介绍了从带有 selenium 和 python 的 optgroup 中选择一个选项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想从这个 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')打印(链接)对于链接中的链接:打印(link.get_attribute('href'))

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

解决方案

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

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

from selenium import webdriver as web从 selenium.webdriver.support.ui 导入 WebDriverWait 作为等待从 selenium.webdriver.support 导入 expected_conditions 作为 ECfrom selenium.webdriver.common.by import Bydriver = 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="开始输入搜索"]'))).点击()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"]]'))))对于链接中的链接:打印(link.get_attribute('href'))

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

I would like to choose a value from this optgroup which should then give me a dropdown of links.

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

Here is my code so far:

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

I either get an exception that the element does not exist, or when I access by index, i get an ElementNotVisibleException due to the aria-hidden attribute being true. Is there any way around this?

解决方案

select is not the node that you need to handle as it's not visible.

Try below code to get required output:

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

P.S. You need to replace text value of li node in '//li[.="Bass"]' XPath with required option

这篇关于从带有 selenium 和 python 的 optgroup 中选择一个选项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆