使用 selenium 打印一段文本并打开多个 windows

Print piece of text using selenium with multiple open windows

在社区的帮助下,我已经能够开发一段能够打印网页行的代码。但是,我知道希望代码为匹配特定 xpath 选择器的多个网页打印一段文本。如何做到这一点?

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


driver = webdriver.Chrome("C:\Program Files (x86)\chromedriver.exe")
driver.get('https://www.flashscore.com/')
wait = WebDriverWait(driver, 20)
driver.maximize_window() # For maximizing window
time.sleep(2)
driver.find_element_by_id('onetrust-reject-all-handler').click()

matchpages = driver.find_elements_by_xpath("//*[@class='preview-ico icon--preview']//*[name()='use']")
for matchpages in matchpages:
    matchpages.click()
    new_window = driver.window_handles[1]
    original_window = driver.window_handles[0]
    driver.switch_to.window(driver.window_handles[1])
    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.previewShowMore.showMore"))).click()
    main = driver.find_element(By.XPATH,"//div[@class='previewLine' and ./b[text()='Hot stat:']]").text
    main = main.replace('Hot stat:','')
    print(main)
    driver.close()
    driver.switch_to_window(original_window)

我认为以下行选择了第一个 'preview' 页:

    new_window = driver.window_handles[1]

但是,这需要针对 flashscore.com 上的所有 'preview' 页进行调整。

此外,打开的windows还应包含以下几行,因为我想将这些行打印出来,以便快速了解当天的热门统计数据。

main = driver.find_element(By.XPATH,"//div[@class='previewLine' and ./b[text()='Hot 
stat:']]").text
    main = main.replace('Hot stat:','')
    print(main)

提前致谢! :)

您提供的代码已关闭。我最终改变了一些东西,例如:

  • 使用 webdriver 管理器而不是本地安装的版本
  • 在 webdriver.Chrome()
  • 中使用的服务和选项
  • 大多数元素使用 XPATH

代码如下: 请注意,我必须点击到第二天才能获得预览按钮进行测试,代码在两个块内,如果需要请删除

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException, TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.support.wait import WebDriverWait
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--no-sandbox')
options.add_argument('--disable-extensions')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--ignore-certificate-errors')
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=options)
url = 'https://www.flashscore.com/'
driver.get(url)

wait = WebDriverWait(driver, 20)
driver.maximize_window()  # For maximizing window
wait.until(ec.visibility_of_element_located((By.XPATH, "/html/body/div[6]/div[1]/div/div[1]/div[2]/div[4]/div[2]/div/section/div/div/div[2]")))
driver.find_element(By.ID, 'onetrust-reject-all-handler').click()
#  Put this Code in so I could test (clicks next so I had PREVIEW buttons to click)
driver.find_element(By.XPATH, "/html/body/div[6]/div[1]/div/div[1]/div[2]/div[4]/div[2]/div/div[1]/div[2]/div/div[3]").click()
#
wait.until(ec.visibility_of_element_located((By.XPATH, "/html/body/div[6]/div[1]/div/div[1]/div[2]/div[4]/div[2]/div/section/div/div/div[2]")))

# Changed this to find all svg tags with the class of preview-ico icon--preview
matchpages = driver.find_elements(By.XPATH, "//*[local-name()='svg' and @class='preview-ico icon--preview']/..")
# Loop through those elements found
for matchpages in matchpages:
    try:
        matchpages.click()
        # Switch to pop-up window
        driver.switch_to.window(driver.window_handles[1])
        wait.until(ec.visibility_of_element_located((By.XPATH, "/html/body/div[2]/div/div[7]/div[1]")))
        # click on the show more
        driver.find_element(By.XPATH, "/html/body/div[2]/div/div[7]/div[2]/div[3]").click()
        # get text of Hot stat element
        main = driver.find_element(By.XPATH, "/html/body/div[2]/div/div[7]/div[2]/div[6]").text
        main = main.replace('Hot stat:', '')
        print(main)
        # Scroll to close window and click it
        close = driver.find_element(By.XPATH, "//*[contains(text(), 'Close window')]")
        driver.execute_script("arguments[0].scrollIntoView();", close)
        driver.find_element(By.XPATH, "//*[contains(text(), 'Close window')]").click()
        # Switch back to main window
        driver.switch_to.window(driver.window_handles[0])
        # Handle timeout
    except TimeoutException:
        close = driver.find_element(By.XPATH, "//*[contains(text(), 'Close window')]")
        driver.execute_script("arguments[0].scrollIntoView();", close)
        driver.find_element(By.XPATH, "//*[contains(text(), 'Close window')]").click()
        driver.switch_to.window(driver.window_handles[0])
        pass
    # Handle no element found
    except NoSuchElementException:
        close = driver.find_element(By.XPATH, "//*[contains(text(), 'Close window')]")
        driver.execute_script("arguments[0].scrollIntoView();", close)
        driver.find_element(By.XPATH, "//*[contains(text(), 'Close window')]").click()
        driver.switch_to.window(driver.window_handles[0])
        pass
driver.quit()

编辑 要处理可能的 Hot streak 或 Hot stat 文本字段,请在找到文本字段“main”后添加 if/elif 语句。

main = driver.find_element(By.XPATH, "/html/body/div[2]/div/div[7]/div[2]/div[6]").text
if 'Hot stat:' in main:
    main = main.replace('Hot stat:', '')
elif 'Hot streak:' in main:
    main = main.replace('Hot streak:', '')