Почему селен не может щелкнуть по элементу?

#python #selenium #screen-scraping

#python #селен #очистка экрана

Вопрос:

Это мой код, с которым я пытаюсь взаимодействовать whoscored.com . Я использовал selenium раньше и знаю, что вы должны нажать «согласиться» на использование файлов cookie, прежде чем сможете делать что-либо еще на веб-сайте. Однако в этом случае селен, похоже, не может нажать на кнопку «Согласиться». Проблема в моем коде или веб-сайте?

Ошибка, которую я получаю, это

 selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element
  

Мой код:

 from selenium import webdriver
import time

driver = webdriver.Chrome("C:Program Files (x86)GoogleChromeApplicationchromedriver.exe")

driver.get("https://www.whoscored.com/Regions/252/Tournaments/2/Seasons/6829/Stages/15151/PlayerStatistics/England-Premier-League-2017-2018")

time.sleep(10)
driver.find_element_by_xpath("/html/body/div[@id='qc-cmp2-container']/div[@id='qc-cmp2-main']/div[@class='sc-dnqmqq dkDDgT qc-cmp-cleanslate']/div[@id='qc-cmp2-ui']/div[@class='qc-cmp2-footer qc-cmp2-footer-overlay qc-cmp2-footer-scrolled']/div[@class='qc-cmp2-summary-buttons']/button[@class='sc-bwzfXH kTIxrL']").click()
  

Комментарии:

1. Я не вижу кнопки согласия на этой странице. Вы уверены?

2. Моим решением для другой страницы было установить расширение adblock. Я использовал драйвер firefox, поэтому я не знаю, как вы это делаете с драйвером Chrome.

3. попробуйте сделать это инкогнито, потому что, возможно, вы уже были на этом сайте раньше

4.Кроме того, используйте один driver.implicitly_wait(10) раз в самом начале вместо расточительного time.sleep(10) .

Ответ №1:

Для меня работает поиск с более простым xpath

 driver.find_element_by_xpath("//button[contains(., 'Agree')]").click()
  

//button найдите все узлы, которые являются тегами кнопок
, и [contains(., 'Agree'] найдите все узлы, внутренний текст которых содержит подстроку «Согласен»

Комментарии:

1. Я подозреваю, что имена классов, которые вы используете, предназначены для динамического изменения. Обычно неправильно полагаться на поиск элемента по непонятным меткам, таким как sc-dnqmqq dkDDgT qc-cmp-cleanslate

Ответ №2:

У меня была такая проблема, и я обнаружил, что этот код всегда работает лучше, чем метод ‘click ()’, даже если элемент не взаимодействует. проверьте это

 yourElement = driver.find_elements_by_xpath(".//button[@class='sc-bwzfXH kTIxrL']")    
driver.execute_script("arguments[0].click();", "yourElement")
  

хотелось бы, чтобы это помогло вам