首页 > 解决方案 > Selenium 使用 Python 自动单击选项卡

问题描述

我正在使用 Selenium 和 Python 来抓取包含 JavaScript 的页面。页面顶部的赛马场结果选项卡,例如“Ludlow”、“Dundalk”,可以手动点击,但没有任何明显的超链接附加到它们。... from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome(executable_path='C:/A38/chromedriver_win32/chromedriver.exe')

driver.implicitly_wait(30)
driver.maximize_window()
# Navigate to the application home page
driver.get("https://www.sportinglife.com/racing/results/2020-11-23")

...

到目前为止,这有效。我使用 BeautifulSoup 来查找 NewGenericTabs 的标签名称,例如“Ludlow”、“Dundalk”等。但是,以下代码尝试自动单击选项卡,每次都会超时。

WebDriverWait(driver, 60).until(EC.element_to_be_clickable((By.LINK_TEXT, "Ludlow"))).click()

欢迎任何帮助。

标签: pythonseleniumselenium-webdriverxpathwebdriverwait

解决方案


WebElement不是标签,<a>而是<span>标签,因此By.LINK_TEXT不起作用。

要单击所需的元素,您可以使用以下任一基于Locator Strategies

  • 勒德洛

    driver.get("https://www.sportinglife.com/racing/results/2020-11-23")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@mode='primary']"))).click()
    driver.find_element_by_xpath("//span[@data-test-id='generic-tab' and text()='Ludlow']").click()
    
  • 邓多克

    driver.get("https://www.sportinglife.com/racing/results/2020-11-23") 
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@mode='primary']"))).click()  
    driver.find_element_by_xpath("//span[@data-test-id='generic-tab' and text()='Dundalk']").click()
    

理想情况下,要单击需要诱导WebDriverWait的元素element_to_be_clickable(),您可以使用以下基于Locator Strategies

  • 勒德洛

    driver.get("https://www.sportinglife.com/racing/results/2020-11-23")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@mode='primary']"))).click()
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//span[@data-test-id='generic-tab' and text()='Ludlow']"))).click()
    
  • 邓多克

    driver.get("https://www.sportinglife.com/racing/results/2020-11-23") 
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@mode='primary']"))).click()  
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//span[@data-test-id='generic-tab' and text()='Dundalk']"))).click()
    
  • 注意:您必须添加以下导入:

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

推荐阅读