【问题标题】:How to click a random link from google search results through Selenium and Python如何通过 Selenium 和 Python 从谷歌搜索结果中单击随机链接
【发布时间】:2019-01-29 06:27:02
【问题描述】:

目前使用 Selenium+ Python 和这段代码:

browser.get('http://www.google.com')
search = browser.find_element_by_name('q')
search.send_keys("how to search the internet")
search.send_keys(Keys.RETURN) # hit return after you enter search text
time.sleep(5) # sleep for 5 seconds so you can see the results
browser.execute_script("window.scrollTo(0, 873)") 
time.sleep(2)
browser.find_element(By.XPATH, '(//h3)[3]/a').click()`

作为我的代码。

会发生什么:转到 Google 并输入单词并点击搜索。向下滚动一点,然后点击第一个链接

我想要什么:我希望能够点击搜索结果页面中的随机链接

如何做到这一点?

编辑:这就是我所说的不必要时的意思: 不必要的1:https://imgur.com/a/70qz89x

不必要的2:https://imgur.com/a/8WWvcnC

这些是我想要的唯一结果: 这个:https://imgur.com/a/eTatFV9

【问题讨论】:

  • 您需要从页面中收集链接,然后从该列表中随机选择。有关choice 方法,请参阅random 包文档。
  • 感谢您的帮助。我想出了如何从页面收集所有链接。但是,有些链接是不必要的。是否可以排除它们?
  • 如果您有不必要的链接,那么您的选择器并不完美。使用更具体的选择器来摆脱它们
  • 嗨@KunwarSodhi,你所说的不必要的链接到底是什么意思?你想编辑你的帖子,给我们一个你需要什么的例子 - 确切的链接,我们可以提供一个详细的解决方案。

标签: python selenium selenium-webdriver xpath webdriver


【解决方案1】:

如果您调用window.scrollTo(0, 873),然后调用click(),则根据您的代码试用,根据您对谷歌搜索结果随机链接上的click()的问题:

find_element(By.XPATH, '(//h3)[3]/a').click()`

Selenium 仍会尝试在第一场比赛中尝试click(),这可能不是您想要的用例

解决方案

为了在谷歌搜索结果的随机链接上click(),您可以从搜索结果中创建一个列表,然后生成一个随机数 并通过 index 调用click(),如下所示:

  • 代码块:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.keys import Keys 
    from random import randint
    
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    options.add_argument('disable-infobars')
    browser=webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    browser.get('http://www.google.com')
    search = browser.find_element_by_name('q')
    search.send_keys("selenium")
    search.send_keys(Keys.RETURN)
    my_search_list = WebDriverWait(browser, 10).until(EC.visibility_of_all_elements_located((By.XPATH, "//h3[@class='r']/a[not(ancestor::div[@class='xIleA'])]")))
    myRandomNumber = randint(0, len(my_search_list))
    print(myRandomNumber)
    my_search_list[myRandomNumber].click()
    
  • 控制台输出:

    4
    

【讨论】:

  • 您能否确保您正在访问http://www.google.com,因为您的程序可能正在访问可能不以.com 结尾的本地google 服务器实例。在这种情况下,您可能需要调整 xpath 但逻辑保持不变。在这次运行中,我得到了 6 的输出。
  • 它有效!在这种情况下,我得到了 2 的输出。但是第一次运行时,我得到了 10 的输出,然后它不起作用。也许当时网页上没有第 10 个链接?
  • 是的,我刚刚得到 10 作为输出,但它不起作用,并说 List Index out of range
  • 好吧,到目前为止,我最多只得到 9 :) 但是为什么你会得到 List Index out of range ?我们没有硬编码任何值...
  • imgur.com/a/IgFlTJN 我不知道为什么会出现这个错误
猜你喜欢
  • 1970-01-01
  • 2018-10-03
  • 2021-08-23
  • 2022-01-18
  • 1970-01-01
  • 2020-11-23
  • 2022-11-17
  • 2015-07-27
  • 1970-01-01
相关资源
最近更新 更多