selenium.common.exceptions.NoSuchElementException: Сообщение: нет такого элемента: невозможно найти элемент с помощью Selenium ChromeDriver Chrome с Python - PullRequest
1 голос
/ 10 июня 2019

Я создаю веб-скребок, который очищает данные цитирования от Web of Science. В пятницу я завершил эту часть программы, но сегодня она перестала работать, и когда я пытаюсь получить доступ к данным цитирования через Selenium, я получаю NoSuchElementException. Я пробовал использовать разные способы (id, class, xpath, css selector) нажатия на этот конкретный элемент, но он всегда выдает ошибку. Вот мой код, который работал, а сейчас нет:

url = 'https://apps.webofknowledge.com/Search.do?product=UA&SID=8F2pCcE8ApJDSKZLHfF&search_mode=GeneralSearch&prID=acd62bc2-0ee0-47a1-a85d-12009db3c2f5'
driver.get(url)
citers_num = driver.find_element_by_class_name('snowplow-citation-network-times-cited-count-link')
citers_num.click()

Вот HTML:

<div class="search-results-data-cite">Times Cited: <a class="snowplow-    times-cited-link" title="View all of the articles that cite this one"     href="/CitingArticles.do     product=WOS&amp;SID=5FAYgZP1cYhuG9LGN3I&amp;search_mode=CitingArticles&amp;parentProduct=WOS&amp;parentQid=18&amp;parentDoc=12&amp;REFID=84460199&amp;excludeEventConfig=ExcludeIfFromNonInterProduct">313</a>

Вот ошибка, которую я получаю сегодня:

citers_num = driver.find_element_by_class_name('snowplow-citation-network-all-times-cited')
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 564, in find_element_by_class_name
    return self.find_element(by=By.CLASS_NAME, value=name)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 978, in find_element
    'value': value})['value']
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"class name","selector":"snowplow-citation-network-all-times-cited"}
  (Session info: chrome=75.0.3770.80)
  (Driver info: chromedriver=74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}),platform=Mac OS X 10.14.1 x86_64)  

Я знаю, что здесь есть другие подобные вопросы, но ни один из них не смог мне помочь. Спасибо!

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

Есть ровно две проблемы.Когда вы пытаетесь набрать click(), вам нужно вызвать WebDriverWait для element_to_be_clickable(), и вы можете использовать любую из следующих стратегий локатора :

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

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.search-results-data-cite a[class*='times-cited-link'][href^='/CitingArticles']"))).click()
    
  • Использование XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='search-results-data-cite']//a[@title='View all of the articles that cite this one' and starts-with(@href, '/CitingArticles')]"))).click()
    
  • Примечание : Вы должны добавить следующий импорт:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

Следующая проблема - несовместимость между версиями двоичных файлов, которые вы используете, следующим образом:

  • Вы используете chromedriver = 74.0
  • Примечания к выпуску chromedriver = 74.0 четко упоминает следующее:

Поддержка Chrome v74

  • Вы используете chrome = 75.0 , которые были обновленынедавний толчок.
  • Примечания к выпуску ChromeDriver v75.0 четко упоминает следующее:

Поддержка Chromev75

So существует явное несоответствие между ChromeDriver v74.0 и Chrome Browser v75.0 , и для его решения вам необходимо:

  • Сохранить Chrome v75 и обновление ChromeDriver до Уровень ChromeDriver v75 .
  • Сохранение ChromeDriver v74 и понижение Chrome до Chrome v74 уровень.
0 голосов
/ 10 июня 2019

Используйте Webdriverwait и следуйте xpath, чтобы щелкнуть по нему.

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,"//div[@class='search-results-data-cite'][contains(.,'Times Cited:')]/a"))).click()

ИЛИ css, следующий за селектором css.

WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"div.search-results-data-cite a"))).click()

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...