Поиск элемента в Selenium + Python с повторяющимися классами - PullRequest
2 голосов
/ 14 февраля 2020

Я использую Selenium + Python, чтобы очистить результаты матчей на странице Battlefy для последующей манипуляции и ввода в базу данных. Я пытаюсь очистить названия команд и результаты с помощью Selenium, потому что для динамической загрузки JS требуется использовать браузер без головы. Тем не менее, я пытаюсь получить текст каждого колледжа, используя имя класса, но метод Selenium find_elements_by_class_name не работает.

Веб-страница: https://battlefy.com/college-league-of-legends/2020-north-conference/5de98dd4196d1311d9e6edbd/stage/5e23b6e395e72856dac06997/bracket/1

Текущий код:

>>> chrome_path = r"C:\Users\...\chromedriver.exe"
>>> driver = webdriver.Chrome(chrome_path)
>>> driver.get("https://battlefy.com/college-league-of-legends/2020-north-conference/5de98dd4196d1311d9e6edbd/stage/5e23b6e395e72856dac06997/bracket/1")
>>> team = driver.find_elements_by_class_name("team-name overflow-ellipsis float-right")
>>> for item in teams:
    print(item.text)

, который ничего не печатает и возвращает пустой массив. Я должен что-то делать неправильно. Как я могу очистить текст названия каждой команды, если он покрыт именем класса?

Ответы [ 2 ]

1 голос
/ 15 февраля 2020

team-name overflow-ellipsis float-right является комбинацией классов, и когда вы используете метод find_elements_by_class_name / find_element_by_class_name, локатор будет преобразован в CSS внутри, но в библиотеке селена. Следовательно, вы должны замаскировать все пробелы (пробелы) с помощью ..

Попробуйте с помощью ниже.

team = driver.find_elements_by_class_name("team-name.overflow-ellipsis.float-right")

Редактировать 1:

Вот реализация селена, где мы можем видеть, что локатор предваряется . и использует By.CSS_SELECTOR внутри. Таким образом, нам не нужно добавлять . для имени первого класса.

enter image description here

0 голосов
/ 15 февраля 2020

Чтобы очистить названия команд с помощью Selenium и Python, вам нужно вызвать WebDriverWait для visibility_of_all_elements_located(), и вы можете использовать любой из следующие Стратегии локатора :

  • Использование CSS_SELECTOR:

    driver.get("https://battlefy.com/college-league-of-legends/2020-north-conference/5de98dd4196d1311d9e6edbd/stage/5e23b6e395e72856dac06997/bracket/1")
    print([my_elem.text for my_elem in WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, ".team-name.overflow-ellipsis.float-right")))])
    
  • Использование XPATH:

    driver.get("https://battlefy.com/college-league-of-legends/2020-north-conference/5de98dd4196d1311d9e6edbd/stage/5e23b6e395e72856dac06997/bracket/1")
    print([my_elem.text for my_elem in WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[@class='team-name overflow-ellipsis float-right']")))])
    
  • Вывод на консоль:

    ['Cougars', 'University of Illinois at Urbana-Champaign', 'Maryville Esports', 'Michigan State University', 'Purdue University', 'Illinois Wesleyan Titans', 'UMN Varsity Gold', 'UC LoL A Team', 'Arbor Esports', 'CWRU 300 Spartans', 'Bethany Esports', 'BGC at OSU', 'University of Wisconsin', 'CGC UIC', 'Indiana University - Purdue University Indianapolis - High Tempo Gaming', 'Missouri State University', 'KSU Wildcats', 'University of Manitoba Bisons', 'Nebraska', 'S&T eSports', 'Illinois State University - Redbird Esports', 'WUSTL Bears', 'University of Iowa A Team', 'TSUES', 'Division 2+', 'Grizzlies', 'Principia College esports', 'Northwestern Varsity', 'Wright State University - Raiders', 'Milwaukee School of Engineering - Raiders', 'UPIKE Esports', 'UMDads', 'Jayhawk Esports', 'NKU Esports', 'Warriors', 'Spartans', 'ND Lol', 'SDSU Team Alpha', 'Rose-Hulman', 'SIUe eSports', 'UND', 'MTU GOLD', 'Polar Bears', 'Purdue Fort Wayne Esports', 'CSU LOL', 'Aquinas Esports', 'Shawnee State Bears', 'Lewis Flyers', 'NDSU League of Legends Club', 'South Dakota Mines - Hardrockers', 'GVSU Laker Legends', 'G&E Club @ Iowa State University', 'MVC Vikings', 'Match from North (Dukes)']
    
  • Примечание : необходимо добавить следующие операции импорта:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...