如何使用 WebDriverWait() 访问 selenium python 中具有相同 class 名称的下一个元素的值

How to use the WebDriverWait() to access the value of the next element having the same class names in selenium python

我正在尝试从该特定站点访问字段 YearQuarter 的值。在 Whosebug 的一位成员的帮助下,我能够实现 year 部分的代码,现在如果我想访问 quarter 部分,那么我该如何访问它。

以下是目前的实施情况。

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

options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-error')
options.add_argument('--ignore-ssl-errors')

url = "https://lifeinsurance.adityabirlacapital.com/about-us/public-disclosure"
driver = webdriver.Chrome(executable_path='drivers/chromedriver.exe')

driver.get(url)

WebDriverWait(driver, 20).until(
    EC.element_to_be_clickable((By.CSS_SELECTOR, "div.selectize-input.items.full.has-options.has-items"))
).click()

year_dropdown = WebDriverWait(driver, 20).until(
    EC.visibility_of_all_elements_located(
        (By.CSS_SELECTOR, "div.selectize-dropdown-content div.option")
    )
)

for year in year_dropdown:
    print(year.text)

欢迎任何提示和建议。

您的年度和季度结构相同。一个 selectPublicYear 另一个 selectPublicQuarter class

wait = WebDriverWait(driver, 20)

# Years
year_selector = ".selectize-control.selectPublicYear"
year_option_selector = year_selector + " .option"

wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, year_selector))).click()

wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, year_option_selector)))
years = driver.find_elements(By.CSS_SELECTOR, year_option_selector)
for year in years:
    print(year.text)
years[-1].click()

# Quarters
quarter_selector = ".selectize-control.selectPublicQuarter"
quarter_option_selector = quarter_selector + " .option"

wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, quarter_selector))).click()
# Wait for option element to be clickable.
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, quarter_option_selector)))
# Get all option elements
quarters = driver.find_elements(By.CSS_SELECTOR, quarter_option_selector)
for quarter in quarters:
    print(quarter.text)
# Select last one
quarters[-1].click()

您可以按值向 select 下拉列表添加方法:

def select_dropdown(name, selector, value):
    print(f'Select "{name}" dropdown, value: "{value}"')

    # Selectors
    selector = ".selectize-control" + selector
    option_selector = selector + " .option"

    wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, selector))).click()

    # Wait for option element to be clickable
    wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, option_selector)))

    # Get all options elements
    option_elements = driver.find_elements(By.CSS_SELECTOR, option_selector)
    # Get text values from options
    options = [opt.text.strip() for opt in option_elements]
    print(f'Available values: {options}')

    # Check if options have value
    if value not in options:
        raise Exception(f'"{name}" dropdown does not have "{value}" value. Available values: {options}')

    option_elements[options.index(value)].click()

调用方式:

select_dropdown(name="Year", selector=".selectPublicYear", value="2020-2021")
select_dropdown(name="Quarter", selector=".selectPublicQuarter", value="Q2: Sep, 2020")

提取文本,例如第 4 季度:2021 年 3 月,所有 <class="option"> 使用 and you have to induce for visibility_of_all_elements_located() and you can use either of the following

  • 使用XPATH:

    driver.get('https://lifeinsurance.adityabirlacapital.com/about-us/public-disclosure')
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//label[text()='Quarter']//following::div[@class='selectize-input items full has-options has-items']"))).click()
    print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[@class='selectize-dropdown-content']//div[contains(@class, 'option')]")))])
    
  • 控制台输出:

    ['All Quarters', 'Q4: Mar, 2021', 'Q3: Dec, 2020', 'Q2: Sep, 2020', 'Q1: Jun, 2020']
    
  • 注意:您必须添加以下导入:

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