#python #loops #selenium
#python #циклы #selenium
Вопрос:
Я хочу загрузить файлы всех команд за сезон с 2015-2016 по 2018-2019. Тем не менее, я пытаюсь перебирать Xpath, которые идентичны, за исключением одного числа в скобках, чтобы выбрать разные команды и годы; последняя скобка, где я заменил число на %b и %i. Вот мой код:
from selenium import webdriver
import csv
from selenium.webdriver.support.ui import Select
from datetime import date, timedelta
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import TimeoutException
chromedriver =("C:/Users/Michel/Desktop/python/package/chromedriver_win32/chromedriver.exe")
driver = webdriver.Chrome(chromedriver)
driver.get("https://evolving-hockey.com/")
#Click Games and then game logs
Gamestab= driver.find_element_by_xpath("/html/body/nav/div/ul/li[6]/a")
Gamestab.click()
Gameslog= driver.find_element_by_xpath("/html/body/nav/div/ul/li[6]/ul/li[3]/a")
Gameslog.click()
# Click Teams tab
Teamstab= driver.find_element_by_xpath("//*[@id='tab-3278-3']/div/ul/li[3]/a")
Teamstab.click()
# Loop all teams and all seasons
## TEAM
for b in range(1,33):
Team= driver.find_element_by_xpath("//*[@id='tab-3959-3']/div/div[1]/div[1]/div/div/div")
Team.click()
Teamname= driver.find_element_by_xpath("//*[@id='tab-3959-3']/div/div[1]/div[1]/div/div/div/div[2]/div/div[%b]" %(b))
Teamname.click()
# ## Season- 20152016to20182019
for i in range(1,5):
Season=driver.find_element_by_xpath("//*[@id='tab-3959-3']/div/div[1]/div[2]/div/div/button")
Season.click()
Season1819=driver.find_element_by_xpath("//*[@id='tab-3959-3']/div/div[1]/div[2]/div/div/div/ul/li[%s]" %(i))
Season1819.click()
Я думаю, что это должно сработать с использованием % и присвоением переменной, которая, по сути, является итеративным элементом в цикле for, точно так же, как я пытался, но это не работает.
Комментарии:
1. Я бы рекомендовал получить все имена команд, используя find_elements_by_xpath, а не find_elemnt_by_xpath, а затем щелкнуть по каждому из них. Дайте мне знать, если вам нужен пример кода.
2. Я хотел бы получить решение, пожалуйста. Я отредактировал свой код, чтобы вы могли получить доступ к веб-сайту и проверить его. Я чувствую, что это должно работать с логикой, которую я использую… Я делал нечто подобное в прошлом, но изменяющимся элементом была строка вместо целого числа. Мне интересно, должен ли я действовать другим способом из-за этого.
3. Что за ошибку вы получаете?
4. «/div[%b]» %(b))» должно ли это быть «/div[%d]»%(b))»
Ответ №1:
Если вы хотите использовать свой существующий код, пожалуйста, исправьте приведенную ниже строку. Просто изменил [%b] на [%d] в конце строки xpath.
Старый код:
Teamname= driver.find_element_by_xpath("//*[@id='tab-3959-3']/div/div[1]/div[1]/div/div/div/div[2]/div/div[%b]" %(b))
Обновленный код:
Teamname= driver.find_element_by_xpath("//*[@id='tab-3959-3']/div/div[1]/div[1]/div/div/div/div[2]/div/div[%d]" %(b))
Вот преломленный код. У меня нет возможности протестировать это.
#click on Games
driver.find_element_by_css("ul.nav.navbar-nav a[data-value='Games']").click()
#click on Game Logs
driver.find_element_by_css_selector("ul.dropdown-menu a[data-value='Game Logs']").click()
#switch to Teams tab
driver.find_element_by_css_selector("ul.nav.nav-tabs a[data-value='Teams']").click()
#click the teams listbox
teamNames = driver.find_element_by_xpath("//div[@class='tab-pane active' and @data-value='Teams']//label[.='Team:']//parent::div//div[@class='selectize-dropdown-content']").click()
#get the list of team names
teams = driver.find_elements_by_xpath("//div[@class='tab-pane active' and @data-value='Teams']//label[.='Team:']//parent::div//div[@class='selectize-dropdown-content']//div[@class='option']")
# get the list of seasons
seasons = driver.find_elements_by_xpath("//div[@class='tab-pane active' and @data-value='Teams']//select[@id='game_logs_teams_season']/option")
# iterate through each team
for team in teams:
team.click()
# iterate through each season
for season in seasons:
seanson.click()
Комментарии:
1. в чем ошибка? а вы пробовали заменить «/ div[%b]»%(b))» на «/ div[%d]»%(b)) в вашей старой логике?
2. Он работает с: «/div[%b]» %(b))» с «/div[%d]» %(b)).
3. У меня есть еще один вопрос. Есть часть, которая, кажется, меняется каждый день; [@id=’tab-3959-3′] есть в каждом find_by_xpath, но номер изменился со вчерашнего дня? Что я мог сделать?
4. В идеале вам не нужен этот «идентификатор» для идентификации элементов. Проверьте css и xpaths, которые я использовал в предоставленном примере кода. Я проверил все эти css и xpaths на странице UAT, которую вы предоставили.