# 前言

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)  # 刷新后

```

运行结果:

[, ,

...后面太长省略了]

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")

```

运行结果:

来源于 : http://mp.weixin.qq.com/s?__biz=MzI5ODU1MzkwMA==&mid=2247484389&idx=1&sn=8a30000edcc0006971401c30d78c5da1&chksm=eca544a6dbd2cdb0a32b72be90fd9a670802ec88653b3bdc64eb5b29c01c467ee53dba772650&mpshare=1&scene=23&srcid=0105WlpnPmvkNSqVTYM36o9H#rd

selenium 实现循环点击_-循环点击遇到的坑(每次点击后返回,页面元素都会变化的解决方法)...相关推荐

  1. 计算机每次网络重插才能启动,为何电脑开机后再插网线才能用_每次开机都要重插网线的解决方法...

    为何电脑开机后再插网线才能用_每次开机都要重插网线的解决方法 最近有朋友向dengb.com小编咨询为何电脑开机后再插网线才能用,否则就无法联网,电脑每次开机都要重新插网线是非常麻烦的,很多人都遇到过 ...

  2. vue在微信里面的兼容问题_微信H5页面兼容性问题分析及解决方法

    随着H5页面越来越流行,越来越多的开发者都开始用最近H5做微信公众号,在这个过程中自然也会遇到不少的问题.小编在这里整理了五种常见的微信H5页面兼容性问题,来和大家分析一下问题的详情.出现原因以及相对 ...

  3. android 点击图标重启,Android应用第一次安装成功点击“打开”后Home键切出应用后再点击桌面图标返回导致应用重启问题的解决方法...

    Android应用第一次安装成功点击"打开"后Home键切出应用后再点击桌面图标返回导致应用重启问题的解决方法 if((getIntent().getFlags() & I ...

  4. continue语句只用于循环语句中_循环里continue,break,return的作用,你知道吗?

    循环里continue,break,return的作用,你知道吗?​mp.weixin.qq.com 前言 循环里Continue,Break,Return经常会用到,也是很容易出错的一个坑,今天特地 ...

  5. python 循环写文件_循环-读写文件-字符编码

    目录: 1.1 while与for循环 1.赋值魔法 #1. 序列解包: 将多个值的序列解开,然后放到序列的变量中. x,y,z = 1,2,3 print(x,y,z) #the result : ...

  6. 将一个数组中的值按逆序重新排放。_六十五、下一个更大的数系列,单调栈解决方法...

    「@Author:Runsen」 ❝ 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. 「---- Runsen」 ❞ 据说,放张小姐姐觉得照片可以提高阅读量,图是来源学校 ...

  7. 我的世界java老崩溃怎么办_我的世界总是崩溃怎么办 崩溃或者无法启动的的原因及解决方法介绍...

    川北在线核心提示:原标题:我的世界总是崩溃怎么办 崩溃或者无法启动的的原因及解决方法介绍 我的世界总是崩溃怎么办?我的世界作为许多玩家都十分喜爱的模拟经营沙盘类游戏,经常有玩家反映在玩我的世界的时候, ...

  8. android 摄像头花屏_关于Android 4.4相机预览、录像花屏的问题的解决方法

    关于Android 4.4相机预览.录像花屏的问题的解决方法 系统: lc android4.4 在做前后摄像头录像的时候,发现会出现花屏的时候,但不是必现,可能会在某一次重启之后会出现,而且出现之后 ...

  9. 安装ubuntu出现花屏_电脑显卡花屏怎么办?电脑独立显卡花屏的原因和解决方法...

    可以说,电脑显卡花屏是比较常见的故障之一,对于我们新装机的新显卡,偶尔都会遇到显卡花屏的问题,各种换系统并重新打显卡驱动都得不到解决,这一般就是显卡自身导致的问题,也叫硬件故障.但是并不是所有的显卡花 ...

最新文章

  1. 索尼计划出售电池业务 含中国制造业务
  2. Tomcat+Apache 负载均衡
  3. java判断星期天_java实现一个月的最后一个星期天
  4. 图解命令行http工具curl使用初步
  5. java 历届试题 合根植物
  6. BASE64Encoder及BASE64Decoder的正确用法
  7. 跨境电商将成全球贸易的主角,下半年跨境电商趋势是什么?
  8. MySQL分表实现上百万上千万记录分布存储的批量查询设计模式
  9. 计算机网络课设--小型企业网络的规划与设计
  10. matlab怎么创建数组对象,数组 – matlab初始化对象数组
  11. 山东理工大学SDUT - ACM OJ 题: Python代码 及分析
  12. 如何设置路由器wifi的用户黑名单?(使别人不能连接你家WIFI)
  13. 保护眼睛颜色的RGB
  14. vue上线后图片不显示_解决Vue打包后访问图片/图标不显示的问题
  15. html css alpha,CSS滤镜之alpha属性-网页设计,HTML/CSS
  16. FastAPI + tortoise-orm基础使用
  17. 论文阅读Unsupervised Corpus Aware Language Model Pre-training for Dense Passage Retrieval
  18. dis反汇编文件的分析理解
  19. 破解创维酷开电视安装第三方应用限制以及替换默认桌面应用突破笔记
  20. tabulate函数

热门文章

  1. python3字典菜鸟教程_Python3 字典(map)
  2. linux与pc机网络通信,PC宿主机和目标机通信方式
  3. 华为鸿蒙开机不用广告,华为鸿蒙系统开机无广告:用户好评,友商品牌批评。只因树大招风...
  4. 三条中线分的六个三角形_初中数学——与三角形有关的线段
  5. 第三篇:稳定性之借风险之力驱动架构演进
  6. MySQL-InnoDB-MVCC多版本并发控制 剖析
  7. 一个类的java代码_求一段java代码,定义一个类
  8. 查看mysql数据用户权限_查看MYSQL数据库中所有用户及拥有权限
  9. linux rpm找不到命令_Linux实战013:yum工具丢失问题解决(yum安装)
  10. Java 蓝桥杯 常用核心类