ElementNotInteractableException:消息:元素<a>无法滚动到视图中

时间:2019-06-16 02:25:56

标签: python selenium

我不熟悉网页抓取功能,需要从网站上抓取一些数据以进行研究:https://www.promedmail.org/

我编码的是

  1. 进入网站
  2. 点击搜索标签
  3. 输入关键字(ebola)
  4. 点击搜索以填充搜索结果
  5. 点击第一个链接以在右侧面板中填充预览

View website image

但是,在#5上,即使我成功地使用商品ID获得了<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 :(得分:0)

快速解决方案: 您可以使用以下JavaScript来单击链接。

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

根本原因: 好吧,我们在HTML中找到了2个与ID匹配的元素。第一个是在latest_alerts下,当您搜索结果时将其隐藏。第二个是在搜索结果下方的屏幕上显示的那个。这就是为什么您无法滚动到该元素的原因,因为当存在多个具有匹配ID的实例时,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()