Home > front end >  Print piece of text using selenium with multiple open windows
Print piece of text using selenium with multiple open windows

Time:12-30

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! : )

CodePudding user response:

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