Search code examples
seleniumweb-scrapingwebdriver

Print piece of text using selenium with multiple open windows


With the help of the community I have been able to develop a piece of code that is able that prints the line of a webpage. However, I know want the code to print the piece of text for multiple webpages that match a certain xpath selector. How can this be done?

    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)

I think the following line selects the first 'preview' page:

    new_window = driver.window_handles[1]

However, this then needs to be adjusted to all the 'preview' pages on flashscore.com.

Furthermore, the following lines should also be incorporated in the opened windows, as I would like to print out these lines in order to get a quick overview of the hot stats of that day.

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

Thanks in advance! : )


Solution

  • The code you provided was close. I ended up changing a few things, such as:

    • Used webdriver manager instead of locally installed version
    • Used service and options within webdriver.Chrome()
    • Used XPATH for most of the elements

    Code is below: NOTE that I had to click to the next day to get PREVIEW buttons to test, code is within two blocks, remove if needed

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

    EDIT To handle possible Hot streak or Hot stat text field, please add an if/elif statement after finding the text field "main".

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