Python Selenium如何定位并点击搜索结果列表第5条条目
问题背景
你在使用Python+Selenium编写谷歌搜索爬虫时,已完成关键词"dog"的搜索逻辑,需要实现点击第5条搜索结果的功能,原有代码无法正常完成点击操作,原有代码如下:
from selenium import webdriver from selenium.webdriver.common.keys import Keys import time from PIL import Image driver = webdriver.Chrome() chrome_options = webdriver.ChromeOptions() chrome_options.add_experimental_option("prefs", {"profile.default_content_setting_values.cookies": 2}) driver = webdriver.Chrome(chrome_options=chrome_options) driver.implicitly_wait(0.5) driver.get("https://www.google.com/") driver.implicitly_wait(0.5) search = driver.find_element_by_name("q") search.send_keys("dog") search.send_keys(Keys.ENTER) time.sleep(0.5) #getting the 5 result for the search assert "No results found." not in driver.page_source results = driver.find_elements_by_xpath('//div[@class="r"]/a/h3') results[4].click()
故障原因
原有代码无法生效主要有4个问题:
- 重复初始化Chrome驱动,第一行无配置的driver实例属于冗余代码,会残留无效后台进程
- 使用的XPath定位规则
//div[@class="r"]/a/h3匹配的是谷歌早年的搜索结果DOM结构,当前谷歌搜索页已经移除了class="r"的结果容器,根本无法匹配到搜索结果元素 - 隐式等待仅设置0.5秒、硬等待0.5秒的时间过短,搜索结果受网络、地域等因素影响加载速度,很容易在拉取结果列表时页面还没渲染完成
- 代码中使用的
find_element_by_name、find_elements_by_xpath等定位方法在Selenium 4.0及以上版本已经被正式废弃,运行会直接抛出属性错误
修正方案
直接替换为以下可运行的代码即可:
from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By import time # 单次初始化配置好Cookie拦截规则的Chrome驱动 chrome_options = webdriver.ChromeOptions() chrome_options.add_experimental_option("prefs", {"profile.default_content_setting_values.cookies": 2}) driver = webdriver.Chrome(options=chrome_options) # 设置合理的隐式等待时长,适配不同网络环境下的页面加载速度 driver.implicitly_wait(5) driver.get("https://www.google.com/") # 执行关键词搜索 search = driver.find_element(By.NAME, "q") search.send_keys("dog") search.send_keys(Keys.ENTER) # 校验搜索结果存在 assert "No results found." not in driver.page_source # 适配当前谷歌搜索页DOM结构,拉取所有自然搜索结果的标题元素 results = driver.find_elements(By.XPATH, '//div[@id="search"]//h3[parent::a]') # 列表索引从0开始计数,第5条结果对应索引位4,直接触发点击 results[4].click()
补充说明
- 如果你仍在使用Selenium 3.x版本,可以保留旧的
find_elements_by_xpath写法,只需要替换XPath规则即可正常运行 - 如果遇到结果元素被广告、弹窗遮挡导致点击失败的情况,可以把点击逻辑替换为
driver.execute_script("arguments[0].click();", results[4]),通过JS直接触发点击,绕过前端遮挡限制 - 不需要额外导入PIL库,当前场景没有用到图片处理能力,导入属于冗余代码
内容的提问来源于stack exchange,提问作者Krishna Manoharan
相关产品推荐
相关产品推荐

