【问题标题】:How to click first link in an overlay using selenium driver python如何使用硒驱动程序python单击覆盖中的第一个链接
【发布时间】:2018-07-13 06:21:20
【问题描述】:

我想构建一个简单的应用程序来学习 Python 中的 Selenium,使用自定义的 google 搜索 url 来搜索 Reddit 并抓取结果: https://cse.google.com/cse/publicurl?cx=011171116424399119392:skuhhpapys8

我正在尝试点击如图所示在网站上搜索后出现的叠加层中的第一个链接

image

到目前为止:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup

url = "https://cse.google.com/cse/publicurl?cx=011171116424399119392:skuhhpapys8"

driver = webdriver.Firefox()
driver.implicitly_wait(30)
driver.get(url)

python_button = driver.find_element_by_class_name('gsc-search-button')
inputElement = driver.find_element_by_id("gsc-i-id1")

soup_level1=BeautifulSoup(driver.page_source, 'lxml')

search = input("Ask Reddit")
inputElement.send_keys(search)
inputElement.send_keys(Keys.ENTER)

overlay = driver.find_element_by_class_name('gsc-results-wrapper-overlay')

first_link = driver.find_element_by_css_selector('a.gsc-title').click()

我得到了错误

selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: a.gsc-title

知道我缺少什么吗?我有什么特别的事情要做来处理这样的覆盖吗?该css选择器有多个元素我不是针对第一个吗?

【问题讨论】:

  • 快速浏览一下,您可能需要先“激活” iframe,然后再尝试点击它。
  • 这样的? WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(driver.find_element_by_tag_name("iframe")))
  • 是的,类似的

标签: python selenium selenium-webdriver


【解决方案1】:

据我所知,链接的类是不是 gsc-title,而是gs-title。因此,您的主要问题。还有其他几件事:

  1. 叠加没有什么特别之处,无需考虑。所以overlay = driver.<...> 不是必需的,除非您使用它来确保显示结果(请参阅下一点)
  2. 更改隐式等待 (driver.implicitly_wait(30)) 不是一个好主意;改用显式等待:

    from selenium.webdriver.support import expected_conditions as EC
    ...
    WebDriverWait(driver, 30).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "gsc-results-wrapper-overlay")))
    first_link = driver.find_element_by_css_selector('a.gs-title').click()
    

【讨论】:

  • 谢谢,仔细研究一下,覆盖层内似乎有一个 iframe。在尝试单击第一个链接之前,我需要切换到该 iframe 吗?
  • @ron_kuby 如果您的元素不在 iframe 中,则您不必切换到 iframe。在您的特定情况下,该元素不在任何 iframe 内。但我已经用其他输入进行了测试,第一个链接也可以在 iframe 内
  • 根据提供的示例,链接不在 iframe 内,但 @AndreiSuvorkov 说它可能用于其他输入。因此,您的脚本可能需要同时处理这两种情况
猜你喜欢
  • 2019-06-09
  • 2022-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
  • 2015-05-04
  • 1970-01-01
相关资源
最近更新 更多