I am trying to click the tabs on the webpage as seen below. Unfortunately, it only seems to click some of the tabs despite correct correct xpath in inspect Chrome. I can only assume it’s not clicking all the tabs because the full xpath is not being used.
However..
I have tried changing the xpath:
//div[@class="KambiBC-collapsible-container KambiBC-mod-event-group-container"]
To:
//div[@class='KambiBC-event-groups-list']//div[@class="KambiBC-collapsible-container KambiBC-mod-event-group-container"]
FOR:
clickMe = wait(driver, 10).until(EC.element_to_be_clickable((By.XPATH,'(//div[@class="KambiBC-collapsible-container KambiBC-mod-event-group-container"])[%s]' % str(index + 1))))
However the issue persists.
I have also tried using CSS:
#KambiBC-contentWrapper__bottom > div > div > div > div > div.KambiBC-quick-browse-container.KambiBC-quick-browse-container--list-only-mode > div.KambiBC-quick-browse__list.KambiBC-delay-scroll--disabled > div > div.KambiBC-time-ordered-list-container > div.KambiBC-time-ordered-list-content > div > div > div.KambiBC-collapsible-container.KambiBC-mod-event-group-container > header
However this keeps giving me errors…
For:
clickMe = wait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR,'("#KambiBC-contentWrapper__bottom > div > div > div > div > div.KambiBC-quick-browse-container.KambiBC-quick-browse-container--list-only-mode > div.KambiBC-quick-browse__list.KambiBC-delay-scroll > div > div.KambiBC-time-ordered-list-container > div.KambiBC-time-ordered-list-content > div > div > div > header")[%s]' % str(index + 1))))
It should be noted that I want to click all the unopened tabs and I cannot seem to use CSS Selectors to find a specific enough element as I believe it does not allow you to narrow down the class element in this case.
Is there a way to get around this issue of not clicking everything?
It should be noted that I am using...
for index in indexes:
indexes = [index for index in range(len(options))]
shuffle(indexes)
for index in indexes:
Is there a more elegant way of using for 1 loop?
[import sys
sys.exit()][1]
Full code
This cycles through all the matches from each league 1 by 1, collecting all the relevant data as needed. You can collect further data within each match by prefixing each query with .
and selecting a match via match.find_element_by_xpath('.//your-query-here')
. Let me know if this did the trick!
import sys, io, os, csv, requests, time
from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
from selenium import webdriverdriver = webdriver.Chrome()
driver.set_window_size(1024, 600)
driver.maximize_window()try:os.remove('vtg121.csv')
except OSError:passdriver.get('https://www.unibet.com.au/betting#filter/football')
time.sleep(1)clickMe = wait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, ('//div[@class="KambiBC-collapsible-container '\'KambiBC-mod-event-group-container"]'))))
time.sleep(0)xp_opened = '//div[contains(@class, "KambiBC-expanded")]'
xp_unopened = '//div[@class="KambiBC-collapsible-container ' \'KambiBC-mod-event-group-container" ' \'and not(contains(@class, "KambiBC-expanded"))]'
opened = driver.find_elements_by_xpath(xp_opened)
unopened = driver.find_elements_by_xpath(xp_unopened)data = []
for league in opened:xp_matches = './/li[contains(@class,"KambiBC-event-item")]'matches = league.find_elements_by_xpath(xp_matches)try:# League Namexp_ln = './/span[@class="KambiBC-mod-event-group-header__main-title"]'ln = league.find_element_by_xpath(xp_ln).text.strip()except:ln = Noneprint(ln)for match in matches:# get all the data per 'match group'xp_team1_name = './/button[@class="KambiBC-mod-outcome"][1]//' \'span[@class="KambiBC-mod-outcome__label"]'xp_team1_odds = './/button[@class="KambiBC-mod-outcome"][1]//' \'span[@class="KambiBC-mod-outcome__odds"]'xp_team2_name = './/button[@class="KambiBC-mod-outcome"][3]//' \'span[@class="KambiBC-mod-outcome__label"]'xp_team2_odds = './/button[@class="KambiBC-mod-outcome"][3]//' \'span[@class="KambiBC-mod-outcome__odds"]'try:team1_name = match.find_element_by_xpath(xp_team1_name).textexcept:team1_name = Nonetry:team1_odds = match.find_element_by_xpath(xp_team1_odds).textexcept:team1_odds = Nonetry:team2_name = match.find_element_by_xpath(xp_team2_name).textexcept:team2_name = Nonetry:team2_odds = match.find_element_by_xpath(xp_team2_odds).textexcept:team2_odds = Nonedata.append([ln, team1_name, team1_odds, team2_name, team2_odds])for league in unopened:league.click()time.sleep(0.5)matches = league.find_elements_by_xpath(xp_matches)try:ln = league.find_element_by_xpath(xp_ln).text.strip()except:ln = Noneprint(ln)for match in matches:try:team1_name = match.find_element_by_xpath(xp_team1_name).textexcept:team1_name = Nonetry:team1_odds = match.find_element_by_xpath(xp_team1_odds).textexcept:team1_odds = Nonetry:team2_name = match.find_element_by_xpath(xp_team2_name).textexcept:team2_name = Nonetry:team2_odds = match.find_element_by_xpath(xp_team2_odds).textexcept:team2_odds = Nonedata.append([ln, team1_name, team1_odds, team2_name, team2_odds])with open('vtg121.csv', 'a', newline='', encoding="utf-8") as outfile:writer = csv.writer(outfile)for row in data:writer.writerow(row)print(row)