Выбор опции в оптгруппе с селеном и питоном - PullRequest
0 голосов
/ 07 мая 2018

Я хотел бы выбрать значение из этой 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'))

Я либо получаю исключение, что элемент не существует, либо когда я получаю доступ по индексу, я получаю исключение ElementNotVisibleException из-за того, что атрибут aria-hidden равен true. Есть ли способ обойти это?

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

В соответствии с HTML, которым вы поделились, чтобы распечатать все опции, которые вы должны заставить WebDriverWait переключиться на нужный кадр, затем нажмите Поле поиска для параметры должны отображаться следующим образом:

  • Кодовый блок:

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    
    options = Options()
    options.add_argument("start-maximized")
    options.add_argument("disable-infobars")
    options.add_argument("--disable-extensions")
    driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get("https://foodmarketmaker.com/main/mmsearch")
    WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@src='https://search.foodmarketmaker.com']")))
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='searchbar']//input[@class='select2-search__field' and @placeholder='start typing to search']"))).click()
    links = driver.find_elements_by_xpath("//li[@class='select2-results__option' and @aria-label='Business Type']/strong//following::ul[1]//li")
    for link in links:
        print(link.get_attribute('innerHTML'))
    
  • Выход на консоль:

    Buyer
    Buyer: Baked Goods
    Buyer: Beverages
    Buyer: Dairy
    Buyer: Fish &amp; Seafood
    Buyer: Fruit &amp; Nuts
    Buyer: Grains &amp; OilSeed
    Buyer: Herbs
    Buyer: Meat &amp; Poultry
    Buyer: Miscellaneous
    Buyer: Specialty Products
    Buyer: Sugar/Confectionary &amp; Snacks
    Buyer: Vegetables
    Eating &amp; Drinking Place
    Eating &amp; Drinking Place: Cafeteria &amp; Buffet
    Eating &amp; Drinking Place: Caterer
    Eating &amp; Drinking Place: Drinking Place
    Eating &amp; Drinking Place: Food Service Contractor
    Eating &amp; Drinking Place: Mobile Food Service
    Eating &amp; Drinking Place: Restaurant
    Eating &amp; Drinking Place: Snack &amp; Nonalcoholic Beverage Bar
    Farmer/Rancher
    Farmer/Rancher: Dairy
    Farmer/Rancher: Forage
    Farmer/Rancher: Fruits &amp; Nuts
    Farmer/Rancher: Grains
    Farmer/Rancher: Herbs
    Farmer/Rancher: Livestock Production (Beef Cattle)
    Farmer/Rancher: Meat &amp; Poultry
    Farmer/Rancher: Specialty Products
    Farmer/Rancher: Vegetables
    Farmers Market
    Fishery
    Fishery: Fish/Shellfish/Seafood
    Food Bank
    Food Bank: Food Bank
    Food Hub
    Food Retailer
    Food Retailer: Baked Goods Store
    Food Retailer: Beer, Wine &amp; Liquor Store
    Food Retailer: Candy, Nut &amp; Confectionery
    Food Retailer: Fish Market
    Food Retailer: Fruit &amp; Vegetable Market
    Food Retailer: Grocery/Convenience Store
    Food Retailer: Health Supplement Store
    Food Retailer: Meat &amp; Poultry Market
    Food Retailer: Other Direct Selling Establishments
    Food Retailer: Other Specialty Food Store
    General Member
    Processor/Packing Shed
    Processor/Packing Shed: Animal Food Manufacturing
    Processor/Packing Shed: Bakery Products
    Processor/Packing Shed: Beverages
    Processor/Packing Shed: Dairy Products
    Processor/Packing Shed: Fish/Shellfish/Seafood Products
    Processor/Packing Shed: Fruit &amp; Vegetable Products
    Processor/Packing Shed: Grain &amp; Oilseed Milling
    Processor/Packing Shed: Meat &amp; Poultry Products
    Processor/Packing Shed: Miscellaneous
    Processor/Packing Shed: Packing Shed
    Processor/Packing Shed: Sugar and Confectionery Products
    Tourism
    Tourism: Agritourism
    Tourism: Fishing Charter
    Tourism: Hunting
    Wholesaler
    Wholesaler: Beer, Wine &amp; Alcoholic Beverages
    Wholesaler: Confectionery &amp; Snacks
    Wholesaler: Dairy Products
    Wholesaler: Farm Products
    Wholesaler: Fish/Shellfish/Seafood
    Wholesaler: Fruit &amp; Vegetable
    Wholesaler: General Grocery
    Wholesaler: Meat &amp; Poultry
    Wholesaler: Other Grocery
    Wholesaler: Packaged Frozen Food
    Winery
    Winery: Blends or Generic Wine
    Winery: Fortified Wine
    Winery: Fruit Wine
    Winery: Other Wine Products
    Winery: Red Wine
    Winery: Sparkling Wine
    Winery: White Wine
    
0 голосов
/ 07 мая 2018

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

P.S. Вам необходимо заменить текстовое значение узла li в '//li[.="Bass"]' XPath обязательным параметром

...