ElementNotInteractableException: Сообщение: Элемент <a>не может быть прокручен в представлении - PullRequest
1 голос
/ 16 июня 2019

Я новичок в изучении веб-страниц и мне нужно удалить некоторые данные с веб-сайта для моего исследования: https://www.promedmail.org/.

То, что я кодировал, было

  1. Получить на сайте
  2. Нажмите на вкладку поиска
  3. Введите ключевое слово (эбола)
  4. Нажмите, чтобы заполнить Результаты поиска
  5. Нажмите на первую ссылку, чтобы заполнить предварительный просмотр на правой панели

Просмотр изображения сайта

Однако на # 5 я не могу щелкнуть ссылку, хотя я успешно получил тег <a>, используя идентификатор статьи. Сообщение об ошибке гласит:

selenium.common.exceptions.ElementNotInteractableException: Сообщение: Элемент не может быть прокручен в представлении

После некоторых исследований я решил, что мне нужно прокрутить ссылку, потому что ссылка не была видна. Я попробовал 5 различных решений, предложенных в stackoverflow, но ни одно из них действительно не помогло мне, и я застрял. Они перечислены в приведенном ниже коде и закомментированы.

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

class WebScraper:
    """Custome web scraper"""
    def __init__(self, url, keyword):
        self.url = url
        self.keyword = keyword

        self.search_results = []
        self.ariticle_ids = []

    def get_all_data(self):
        """Get beautiful soup objects for all articles"""

        driver = webdriver.Firefox()
        driver.get(self.url)
        driver.find_element_by_id('search_tab').click()
        driver.find_element_by_id('searchterm').send_keys(self.keyword)
        driver.find_element_by_css_selector('#searchby_other > input[type=submit]').click()

        element_article_id = driver.find_element_by_css_selector('#search_results > ul')
        source_article_id = element_article_id.get_attribute('outerHTML')
        soup_article_id = BeautifulSoup(source_article_id, 'html.parser')
        tag_a = soup_article_id.select('ul > li > a[id]')
        for i in range(len(tag_a)):
            self.ariticle_ids.append(tag_a[i].get('id'))

        element_link = driver.find_element_by_id(self.ariticle_ids[0])

        # driver.execute_script("arguments[0].scrollIntoView();", element_link)
        # driver.execute_script("window.scrollBy(0, -150);")
        # element_link.location_once_scrolled_into_view
        # ActionChains(driver).move_to_element(driver.find_element_by_id(self.ariticle_ids[0])).perform()
        # WebDriverWait(driver, 1000000).until(EC.element_to_be_clickable((By.ID, self.ariticle_ids[0]))).click()

        element_link.click()

if __name__ == "__main__":
    url = 'https://www.promedmail.org/'
    keyword = 'ebola'
    webscrapper = WebScraper(url, keyword)
    webscrapper.get_all_data()

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

1 Ответ

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

Быстрое решение: Вы можете нажать на ссылку, используя JavaScript, как показано ниже.

driver.execute_script("arguments[0].click()",driver.find_element_by_id(ariticle_ids[0]))

Основная причина: Ну, мы нашли 2 элемента, совпадающие с идентификатором в HTML. И первый из них находится в каталоге latest_alerts, который скрыт при поиске результатов Второй - тот, который отображается на экране под результатами поиска. Вот почему вы не можете прокрутить до элемента, так как find_element_by_id получит первый экземпляр, когда есть несколько экземпляров с совпадающим идентификатором.

Вы можете подтвердить это с помощью приведенной ниже строки кода.

print(len(driver.find_elements_by_id(self.ariticle_ids[0]))).

Решение: Если вы хотите прокрутить до элемента в результатах поиска и затем щелкнуть по нему, вы можете использовать ниже

element_link = driver.find_elements_by_id(self.ariticle_ids[0])[-1]
element_link.location_once_scrolled_into_view
element_link.click()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...