ElementNotInteractiableException:消息:无法将元素<a>滚动到vi中

2024-04-26 19:10:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个新的网页抓取和需要从我的研究网站:https://www.promedmail.org/一些数据。你知道吗

我编码的是

  1. 进入网站
  2. 单击“搜索”选项卡
  3. 键入关键字(埃博拉)
  4. 单击“搜索”填充搜索结果
  5. 单击第一个链接以填充右侧面板上的预览

View website image

但是,在#5上,即使我使用文章ID成功地获得了<a>标记,我也无法单击链接。错误消息显示:

selenium.common.exceptions.ElementNotInteractableException: Message: Element <a id="id6519943" class="lcl" href="javascript:;"> could not be scrolled into view

经过一些研究,我想我需要滚动到链接,因为链接是不可见的。我尝试了stackoverflow中建议的5种不同的解决方案,但没有一种真正适合我,我陷入了困境。它们在下面的代码中列出并注释掉。你知道吗

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()

单击链接时,右侧面板上将弹出一个预览。我打算把这篇文章删掉,转到下一个链接。你知道吗


Tags: fromimportselfidurlby链接driver
1条回答
网友
1楼 · 发布于 2024-04-26 19:10:43

快速解决方案: 您可以使用javascript单击链接,如下所示。你知道吗

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

根本原因: 嗯,我们在html中找到了2个与id匹配的元素。第一个是在搜索结果时隐藏的最新通知。第二个是显示在搜索结果下的屏幕。这就是为什么您不能滚动到元素,因为当有多个具有匹配id的实例时,按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()

相关问题 更多 >