如何使用 Selenium 在组合输入和 li 字段中选择选项?

问题描述 投票:0回答:1

我遇到了一个我不知道如何迭代其选项的字段。我需要能够一一选择每个元素,以便页面加载关联的信息,然后为每个选项检索该信息。结构如下。

<div class="col-xs-10 col-xs-offset-1 mar-ver">
  <select id="filter" multiple data-placeholder="Filtrar.." name="namefilter" style="display: none;">
    <option value="limitedtest">limit test</option>
    <option value="test_2">Test 2</option>
    <option value="test_3">Test 3</option>
    ...
  </select>
  <div class="chosen-container chosen-container-multi" title id="agendafilter_chosen" style="width: 99%;">
    <ul class="chosen-choices">
      <li class="search-field">
        <input class="chosen-search-input default" type="text" autocomplete="off" value="Filtrar" style="width: 147px;">
      </li>
    </ul>
    <div class="chosen-drop">
      <ul class="chosen-results">
        <li class="active-result" data-option-array-index="0">limit test</li>
        <li class="active-result" data-option-array-index="1">Test 2</li>
        <li class="active-result" data-option-array-index="2">Test 3</li>
      </ul>
    </div>
  </div>
</div>

我尝试从 select id="filter" 中选择一个选项,但它抛出“选择禁用错误”。 我还尝试将值传递给输入,但它只显示列表并删除发送的文本。

option = "Test 3"
chosen_search_input = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH, "/html/body/div[1]/div[2]/div[4]/div/div/div/div/div[1]/div[2]/div[1]/div[1]/div/ul/li/input"))
    )
    chosen_search_input.send_keys(option)

您还可以建议其他方法吗? 感谢您的宝贵时间。

python selenium-webdriver web-scraping html-lists
1个回答
0
投票

您正在处理Chosen库。
这改变了通过本机 Selenium 功能进行的经典 Select 处理。

以下代码对我来说工作正常(在here中的选择上进行了测试):



wait = WebDriverWait(driver, 10)

driver.get("https://harvesthq.github.io/chosen/")
dropdown_wrapper = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.chosen-container-single"))).click()

options = [option.text for option in driver.find_elements(By.CSS_SELECTOR, '.chosen-results li') if option.text]
for i, option in enumerate(options):
    if i != 0:
        wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.chosen-container-single"))).click()

    wait.until(EC.element_to_be_clickable((By.XPATH, f'//li[text()="{option}"]'))).click()
    wait.until(EC.invisibility_of_element_located((By.CLASS_NAME, 'chosen-loading')))

    # your retrieve logic goes here
    # your retrieve logic goes here
    # your retrieve logic goes here

    print("Handled: " + option)

因此,您首先收集所有选项,然后通过打开下拉列表并选择所需的选项来一一处理它们。

© www.soinside.com 2019 - 2024. All rights reserved.