前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >selenium+python自动化86-循环点击遇到的坑

selenium+python自动化86-循环点击遇到的坑

作者头像
上海-悠悠
发布2018-04-08 17:51:33
3.6K0
发布2018-04-08 17:51:33
举报

# 前言

selenium定位一组元素,批量操作循环点击的时候会报错:Element not found in the cache - perhaps the page has changed since it was looked up

实现目标:批量点击标题,获取每个页面的url地址

代码如下:

```

# coding:utf-8

from selenium import webdriver

driver = webdriver.Firefox()

driver.get("https://www.cnblogs.com/yoyoketang/")

all = driver.find_elements_by_css_selector(".postTitle2")

for i in all:

i.click()

print(driver.current_url) # 打印当前页url

driver.back()

```

运行结果:

http://www.cnblogs.com/yoyoketang/p/7259993.html

Traceback (most recent call last):

selenium.common.exceptions.StaleElementReferenceException: Message: Element not found in the cache - perhaps the page has changed since it was looked up

这里不少人就会问了:

- “为什么第一次点击可以,for循环第二次点击就不行了呢?”

由于第一次点击后,页面刷新了,我们可以手工点击的时候,注意观察页面,页面是有刷新动作的。

- “为什么明明定位到了,点击会报错呢?”

页面刷新后元素的属性是没变,但是element却变了,所有之前定位的元素element都过期了。

- “那么如何实现呢?”

如何实现,这个才是本篇重点要讲的。

一、 分析问题

1.当页面上有点击行为的时候,页面是会刷新的,为了模拟页面刷新后查看元素是不是会变,我们可以用refresh刷新页面,然后查看刷新前后元素的变化。

```

# coding:utf-8

from selenium import webdriver

import time

driver = webdriver.Firefox()

driver.get("https://www.cnblogs.com/yoyoketang/")

all = driver.find_elements_by_css_selector(".postTitle2")

print(all) # 刷新前

driver.refresh()

all_new = driver.find_elements_by_css_selector(".postTitle2")

print(all_new) # 刷新后

```

运行结果:

[<selenium.webdriver.remote.webelement.WebElement (session="36801e98-3a57-41b1-a58e-021fe925fd57", element="{88a2f797-3833-4ea4-a734-72c5c59800ff}")>, <selenium.webdriver.remote.webelement.WebElement (session="36801e98-3a57-41b1-a58e-021fe925fd57", element="{529248de-6ca0-43d9-8747-34d7dad28c6c}")>,

...后面太长省略了]

2.很明显element里面的值发生了变化,所以第一次点击是可以点的,点完之后,页面刷新了,然后页面上的元素已经发生变化了,第二次循环的时候还是用刷新前的元素去定位点击的,自然就会报错了。

二、 解决方案

1.针对页面刷新后,之前的元素失效问题,在for循环体里面可以重新定位一次,覆盖掉之前旧的就行了。

2.第一次获取全部元素后,通过len函数获取总个数

3.for循环的时候不要循环定位元素的list对象,换成range函数去循环

4.参考代码如下:

```

# coding:utf-8

from selenium import webdriver

import time

driver = webdriver.Firefox()

driver.get("https://www.cnblogs.com/yoyoketang/")

all = driver.find_elements_by_css_selector(".postTitle2")

s = len(all)

print(u"获取总个数:%s"%s)

for i in range(s):

all[i].click()

time.sleep(2)

url = driver.current_url

print(u"获取当前页面url:%s"%url)

driver.back() # 点完之后返回

# 重新获取一次元素

all = driver.find_elements_by_css_selector(".postTitle2")

```

运行结果:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-01-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从零开始学自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档