一、操作代码

# -*- coding: utf-8 -*-"""
@author: lucas
@Function:
@file: backAndForwardAndRefresh.py
@time: 2021/8/23 11:43 上午
"""
import unittestfrom selenium import webdriver
from time import sleepclass BackAndForwardAndRefresh(unittest.TestCase):def setUp(self):self.driver = webdriver.Chrome()def test_window_operate(self):driver = self.driverdriver.maximize_window()driver.get('http://www.baidu.com')print 'base_url: ', driver.current_urldriver.find_element_by_id('kw').send_keys(u'进击的雷神')driver.find_element_by_id('su').click()sleep(2)print 'after search: ', driver.current_url# backdriver.back()print 'back to: ', driver.current_url# forwarddriver.forward()print 'forward to: ', driver.current_urlsleep(2)# refreshdriver.refresh()print 'refresh: ', driver.current_urldef tearDown(self):self.driver.close()if __name__ == "__main__":unittest.main()

结果:

明显能够看到浏览器的后退、前进与刷新的动作。

base_url:  https://www.baidu.com/
after search:  https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E8%BF%9B%E5%87%BB%E7%9A%84%E9%9B%B7%E7%A5%9E&fenlei=256&rsv_pq=cc0ab98200016a85&rsv_t=73a7Soa7YgETBMmhXU7RO5xlyCbNY4Sqg8%2F%2Fa2825xwaCHTMBnlD9zUZVek&rqlang=cn&rsv_enter=0&rsv_dl=tb&rsv_sug3=5&rsv_sug1=1&rsv_sug7=100&rsv_btype=i&prefixsug=%25E8%25BF%259B%25E5%2587%25BB%25E7%259A%2584%25E9%259B%25B7%25E7%25A5%259E&rsp=0&inputT=235&rsv_sug4=236&rsv_jmp=fail
back to:  https://www.baidu.com/
forward to:  https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E8%BF%9B%E5%87%BB%E7%9A%84%E9%9B%B7%E7%A5%9E&fenlei=256&rsv_pq=cc0ab98200016a85&rsv_t=73a7Soa7YgETBMmhXU7RO5xlyCbNY4Sqg8%2F%2Fa2825xwaCHTMBnlD9zUZVek&rqlang=cn&rsv_enter=0&rsv_dl=tb&rsv_sug3=5&rsv_sug1=1&rsv_sug7=100&rsv_btype=i&prefixsug=%25E8%25BF%259B%25E5%2587%25BB%25E7%259A%2584%25E9%259B%25B7%25E7%25A5%259E&rsp=0&inputT=235&rsv_sug4=236&rsv_jmp=failrefresh:  https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E8%BF%9B%E5%87%BB%E7%9A%84%E9%9B%B7%E7%A5%9E&fenlei=256&rsv_pq=cc0ab98200016a85&rsv_t=73a7Soa7YgETBMmhXU7RO5xlyCbNY4Sqg8%2F%2Fa2825xwaCHTMBnlD9zUZVek&rqlang=cn&rsv_enter=0&rsv_dl=tb&rsv_sug3=5&rsv_sug1=1&rsv_sug7=100&rsv_btype=i&prefixsug=%25E8%25BF%259B%25E5%2587%25BB%25E7%259A%2584%25E9%259B%25B7%25E7%25A5%259E&rsp=0&inputT=235&rsv_sug4=236&rsv_jmp=fail

二、使用场景:

一种情况就是,当你从一个父页面跳转到子页面进行操作,操作完之后没有“返回”之类的按钮或链接,重新进入父页面又很麻烦,back()可以帮你。forward()与此类似,相对没有back()那么常用。

当你修改了页面信息但是没有即时刷新时,可以手动refresh()

三、问题:

当你前进并退回原来的页面或刷新页面之后,页面的元素id是改变了的。不要妄图用原来定位好的WebElement去操作现在的页面元素!否则会出现如下报错:

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

错误代码示范:

# -*- coding: utf-8 -*-"""
@author: lucas
@Function:
@file: backAndForwardAndRefresh.py
@time: 2021/8/23 11:43 上午
"""
import unittestfrom selenium import webdriver
from time import sleepclass BackAndForwardAndRefresh(unittest.TestCase):def setUp(self):self.driver = webdriver.Chrome()def test_window_operate_exceptions(self):driver = self.driverdriver.maximize_window()driver.get('http://www.baidu.com')kw = driver.find_element_by_id('kw')# 原页面元素IDprint kwdriver.refresh()# 刷新之后的kw元素IDprint driver.find_element_by_id('kw')# 再用原来的元素ID去操作就会抛出异常kw.send_keys('csdn')def tearDown(self):self.driver.close()if __name__ == "__main__":unittest.main()

错误信息:

<selenium.webdriver.remote.webelement.WebElement (session="acc7325310c8fd43eb92e94a490213e5", element="9bd6b618-3c5e-4bd1-bb68-ee9cf7676161")>
<selenium.webdriver.remote.webelement.WebElement (session="acc7325310c8fd43eb92e94a490213e5", element="49f84f29-1968-432a-8766-d8c36d28cf7f")>Ran 1 test in 4.476sFAILED (errors=1)Error
Traceback (most recent call last):File "/Users/leiyuxing/PycharmProjects/pythonProject4/study/backAndForwardAndRefresh.py", line 54, in test_window_operate_exceptionskw.send_keys('csdn')File "/Users/leiyuxing/PycharmProjects/pythonProject4/venv/lib/python2.7/site-packages/selenium/webdriver/remote/webelement.py", line 479, in send_keys'value': keys_to_typing(value)})File "/Users/leiyuxing/PycharmProjects/pythonProject4/venv/lib/python2.7/site-packages/selenium/webdriver/remote/webelement.py", line 633, in _executereturn self._parent.execute(command, params)File "/Users/leiyuxing/PycharmProjects/pythonProject4/venv/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in executeself.error_handler.check_response(response)File "/Users/leiyuxing/PycharmProjects/pythonProject4/venv/lib/python2.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_responseraise exception_class(message, screen, stacktrace)
StaleElementReferenceException: Message: stale element reference: element is not attached to the page document(Session info: chrome=92.0.4515.159)
Process finished with exit code 1

能看到两次输出的WebElement是完全不同的,还用原来的元素去操作当然是不行的:

分析:

原因很明显,你用别人的身份证id去找现在的人,哪怕这两个人长得很像,他也会告诉你:对不起,你找错人了。

当然,不仅仅这一种情况,如果你执行以下的操作,都有可能找错人:

refresh,不论你是主动刷新还是页面自动刷新
back,已经跳转到了其他页面,然后你用driver.back()跳回来,这也是一张新的页面了
跳转到了新的页面,但这张新页面上有一些元素跟之前页面是长得一样的,这也是一张新的页面了。比如:一排分页按钮,你点击下一页跳转到了第二页,想要还用原来的元素操作到下一页,那也是不可能的了。
除此之外可能还有其他的原因,总之你看到这类型长得差不多,但是对页面有了操作的情况,就应该想想这种可能性了。

那遇到这种情况该怎么办?

很简单:

只要刷新页面之后重新获取元素就行,不要提前获取一组元素,然后去循环操作每一个元素,这种情况还是获取元素的个数,然后在循环中获取相应位置的元素,在用的时候才去获取,这样你就获取到最新的id了,也不会出现找错人的尴尬了。

总之一句话,遇到页面有变化的情况,不要去循环元素,去循环个数或者定位方式,在循环中获取元素。

四、总结

1、浏览器导航栏的三个按钮:后退、前进、刷新

driver.back()driver.forward()driver.refresh()

2、当你前进并退回原来的页面或刷新页面之后,页面的元素id是改变了的。不要妄图用原来定位好的WebElement去操作现在的页面元素!否则会出现如下报错:

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

selenium之 浏览器导航栏的三个按钮(back、forward、refresh)相关推荐

  1. 21天学习之二(Android 10.0 SystemUI默认去掉底部导航栏的三种方法)

    活动地址:CSDN21天学习挑战赛 1.概述 在定制化开发中,在SystemUI的一些定制功能中,针对默认去掉底部导航栏的方法有好几种,StatusBar和DisplayPolicy.java中api ...

  2. 转载:Android底部导航栏,三种风格和实现

    原文出处 标题:Android底部导航栏,三种风格和实现 作者:阿飞__ 原文链接:Android底部导航栏,三种风格和实现_阿飞__的博客-CSDN博客_android导航栏 一.效果图展示 如果动 ...

  3. Android底部导航栏的三种风格实现

    一.效果图展示 如果动图没有动的话,也可以看下面这个静态图 以下挨个分析每个的实现,这里只做简单的效果展示,大家可以基于目前代码做二次开发. 二.BottomNavigationView 这是 Goo ...

  4. 如何隐藏iPhone导航栏上的“后退”按钮?

    本文翻译自:How to hide 'Back' button on navigation bar on iPhone? I added a navigation control to switch ...

  5. uni-app自定义导航栏右侧做增加按钮并跳转链接

    uni-app自定义导航栏右侧做增加按钮并跳转链接 uni-app 在页面上的导航栏右侧做一个增加的图标 并实现跳转 1. 先看效果图 2. 实现思路 使用阿里图标库的字体图标, 下载放入本地文件 p ...

  6. android底部导航栏软件,三步搞定android应用底部导航栏

    很多android应用底部都有一个底部导航栏,方便用户在使用过程中随意切换.目前常用的做法有三种:一种是使用自定义tabHost,一种是使用activityGroup,一种是结合FrameLayout ...

  7. Android底部导航栏,三种风格和实现

    一.效果图展示 如果动图没有动的话,也可以看下面这个静态图 以下挨个分析每个的实现,这里只做简单的效果展示,大家可以基于目前代码做二次开发. 二.BottomNavigationView 这是 Goo ...

  8. [RK3568 Android11] 开发之系统动态隐藏导航栏(三)

    目录 前言 一.系统创建导航栏广播接口 二.验证导航栏广播接口功能 1.使用am命令测试广播接口

  9. IOS 自定义导航栏标题和返回按钮标题

    IOS中自定义导航栏标题: UILabel *titleText = [[UILabel alloc] initWithFrame: CGRectMake(160, 0, 120, 50)]; tit ...

最新文章

  1. redirect和forward的区别
  2. 使用ulimit设置文件最大打开数
  3. Docker笔记:常用服务安装——Nginx、MySql、Redis(转载)
  4. 【JS 逆向百例】元素ID定位加密位置,某麻将数据逆向
  5. C#使用并行任务库(TPL)
  6. 高手云集 WCTF世界黑客大师赛今日开战
  7. 【问题解决】华硕A450C触控板失灵
  8. Apache Kafka SAP
  9. 2020 智能零售领域最具商业合作价值企业盘点
  10. 如何根据电脑显卡选择CUDA版本及显卡驱动
  11. SD卡fat32文件格式说明
  12. 局域网连接外网时,二级路由器设置
  13. 国外LEAD赚钱提现到WMZ,附赚钱项目
  14. Java开发erp系统,高级面试题+解析
  15. C++ gcc编译器加速优化
  16. C#中的常用Math函数归纳
  17. 安卓webview中键盘遮挡输入框如何解决
  18. 商业保理与 P2P 是如何结合运作的
  19. AF BAF tuning <5>
  20. Levenshtein 自动机(拼音纠错)

热门文章

  1. ctwing电信AEP平台对接涂鸦智能云平台python程序源码
  2. 润乾报表通过JS自带函数来实现自动计算中的四舍五入
  3. wx朋友圈Hook(一)
  4. firstChild,lastChild,NextSibling,previousSibling的使用
  5. 简述分类法的优缺点_自由分类法的优缺点
  6. java前端桌面设计javafx布局思路
  7. 用matlab实现kpca(核主成分分析法)
  8. python canvas画弧度_「万圣节教程」不给糖就捣乱,用Python绘制有趣的万圣节南瓜怪...
  9. Python-下载MP3
  10. 图片处理 | 分享几个图片处理相关工具