Python和Selenium:What'这是访问Javascript构建的下拉菜单中隐藏的链接的好方法

Python and Selenium: What's a good way to access links hidden in dropdown menus built by Javascript?

本文关键字:下拉菜单 构建 Javascript 隐藏 方法 链接 访问 Selenium What Python      更新时间:2023-09-26

我正在使用Selenium在Python中构建一个网络爬虫。下面是搜索链接的函数。它运行良好,除了被注释掉的部分。这个想法是将鼠标悬停在正在检查的页面上的每个链接上,如果悬停操作显示了更多的链接(例如,在用Javascript构建的下拉菜单中),则使用对getLinksFromHTML的递归调用添加这些链接("if code!=1"部分只是为了确保只有一个递归调用)。

然而,当我在JS下拉菜单中有链接的页面上测试递归调用时,它不会拾取任何新的链接(我正在查看的页面是http://wilmingtontaxesandaccounting.com)。所有可见的链接都被很好地拾取。

我该怎么做才能让Selenium看到这些下拉链接?我需要一个通用的解决方案,即没有特定的元素ID或任何其他特定于页面的代码。感谢阅读!

def getLinksFromHTML(currUrl, code):
    ListlinkerHref = browser.find_elements_by_xpath("//*[@href]")
    links1 = []
    links2 = []
    for link in ListlinkerHref:
        url = link.get_attribute("href")
        #hov = ActionChains(browser).move_to_element(link)
        #hov.perform()
        #if code != 1:
            #links1 = self.getLinksFromHTML(currUrl, 1)
        if url not in links1:
            links2.append(url)
    return links1 + links2  

原来它不起作用的原因是我使用的是Firefox驱动程序。显然,在Firefox中,move_to_element实际上并没有悬停在元素上,它只是"聚焦"在那里。当我切换到Chrome驱动程序时,它实际上悬停在菜单项上并显示子菜单。(请注意,实际函数中有一些错误,但这不是这个问题的重点。)

TL;DR:如果你使用的是Selenium网络驱动程序,并且你想将鼠标悬停在链接上以显示子菜单等内容,请使用Chrome,而不是Firefox。