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

本文介绍如何使用Selenium的driver.back(), driver.forward() 和 driver.refresh() 方法来模拟浏览器的后退、前进和刷新操作,并提供了实际代码示例。此外,还讨论了在页面元素更新后继续操作可能出现的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

更多关于python selenium的文章,请关注我的专栏:Python Selenium自动化测试详解


今天这几个方法非常简单,就是我们能看到的浏览器导航栏的三个按钮:后退、前进、刷新

导航栏按钮

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

不多说,上代码试试

# -*- coding: utf-8 -*-

from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.maximize_window()
driver.get('http://www.baidu.com')
print 'base_url: ', driver.current_url

driver.find_element_by_id('kw').send_keys(u'selenium 灰蓝')
driver.find_element_by_id('su').click()
sleep(2)
print 'after search: ', driver.current_url

driver.back()  # back
print 'back to: ', driver.current_url

driver.forward()  # forward
print 'forward to: ', driver.current_url

sleep(2)
driver.refresh()  # refresh
print 'refresh: ', driver.current_url

sleep(2)
driver.quit()

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

https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=selenium%20%E7%81%B0%E8%93%9D&rsv_pq=f88ee279000319b4&rsv_t=3537ECuJsvn8biOOxAemTJhRgJA9fRB%2FgYyaBy3sdcQagRhU5jOqEDICoQI&rqlang=cn&rsv_enter=0&rsv_sug3=11&inputT=266&rsv_sug4=266
https://www.baidu.com/
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=selenium%20%E7%81%B0%E8%93%9D&rsv_pq=f88ee279000319b4&rsv_t=3537ECuJsvn8biOOxAemTJhRgJA9fRB%2FgYyaBy3sdcQagRhU5jOqEDICoQI&rqlang=cn&rsv_enter=0&rsv_sug3=11&inputT=266&rsv_sug4=266
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=selenium%20%E7%81%B0%E8%93%9D&rsv_pq=f88ee279000319b4&rsv_t=3537ECuJsvn8biOOxAemTJhRgJA9fRB%2FgYyaBy3sdcQagRhU5jOqEDICoQI&rqlang=cn&rsv_enter=0&rsv_sug3=11&inputT=266&rsv_sug4=266

那么什么时候会用呢?

一种情况就是,当你从一个父页面跳转到子页面进行操作,操作完之后没有“返回”之类的按钮或链接,重新进入父页面又很麻烦,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 -*-

from selenium import webdriver

driver = webdriver.Firefox()
driver.maximize_window()
driver.get('http://www.baidu.com')


kw = driver.find_element_by_id('kw')
print kw  # 原页面元素ID

driver.refresh()

print driver.find_element_by_id('kw')  # 刷新之后的kw元素ID
kw.send_keys('csdn')  # 再用原来的元素ID去操作就会抛出异常

driver.quit()

来看看输出结果:

<selenium.webdriver.remote.webelement.WebElement (session="19a16be7-f885-4454-aa44-065b35d8377f", element="{307bfd7c-bcb8-4bed-a0f0-164924e9f648}")>
<selenium.webdriver.remote.webelement.WebElement (session="19a16be7-f885-4454-aa44-065b35d8377f", element="{8eac4fb5-4c8f-4141-b9d5-2ced9b412388}")>
Traceback (most recent call last):
  File "D:/Code/py files/zhigou/zhigou_framework/test/UI_test/case/testnavigation.py", line 16, in <module>
    kw.send_keys('csdn')  # 再用原来的元素ID去操作就会抛出异常
  File "C:\APP\Python2.7.10\lib\site-packages\selenium\webdriver\remote\webelement.py", line 334, in send_keys
    self._execute(Command.SEND_KEYS_TO_ELEMENT, {'value': typing})
  File "C:\APP\Python2.7.10\lib\site-packages\selenium\webdriver\remote\webelement.py", line 469, in _execute
    return self._parent.execute(command, params)
  File "C:\APP\Python2.7.10\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 201, in execute
    self.error_handler.check_response(response)
  File "C:\APP\Python2.7.10\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 194, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.StaleElementReferenceException: Message: Element not found in the cache - perhaps the page has changed since it was looked up
Stacktrace:
    at fxdriver.cache.getElementAt (resource://fxdriver/modules/web-element-cache.js:9407)
    at Utils.getElementAt (file:///c:/users/zx/appdata/local/temp/tmpsorvob/extensions/fxdriver@googlecode.com/components/command-processor.js:8992)
    at fxdriver.preconditions.visible (file:///c:/users/zx/appdata/local/temp/tmpsorvob/extensions/fxdriver@googlecode.com/components/command-processor.js:10043)
    at DelayedCommand.prototype.checkPreconditions_ (file:///c:/users/zx/appdata/local/temp/tmpsorvob/extensions/fxdriver@googlecode.com/components/command-processor.js:12597)
    at DelayedCommand.prototype.executeInternal_/h (file:///c:/users/zx/appdata/local/temp/tmpsorvob/extensions/fxdriver@googlecode.com/components/command-processor.js:12614)
    at DelayedCommand.prototype.executeInternal_ (file:///c:/users/zx/appdata/local/temp/tmpsorvob/extensions/fxdriver@googlecode.com/components/command-processor.js:12619)
    at DelayedCommand.prototype.execute/< (file:///c:/users/zx/appdata/local/temp/tmpsorvob/extensions/fxdriver@googlecode.com/components/command-processor.js:12561)

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

两次WebElement不同

所以在有可能有页面刷新的时候,不要用这种获取到元素,然后一直操作这个元素的写法;要在刷新之后重新获取一下元素进行操作。

<think>好的,用户之前询问了如何使用Selenium实现浏览器的导航功能,比如前进、后退、刷新和地址栏操作,我给出了详细的代码说明。现在用户的新请求是要将这些代码说明生成一个Excel文件。我需要考虑用户为什么需要生成Excel文件,可能的原因是什么。 首先,用户可能是为了更好的文档管理,将代码和说明整理到表格中方便查看或分享给团队。或者用户可能需要将代码示例作为培训材料,用Excel来分步骤教学。也有可能用户对编程不太熟悉,更习惯使用表格形式来记录操作步骤,这样更容易理解。 接下来,我需要确定如何将之前的代码说明转化为Excel文件的结构。用户可能需要每个功能点的代码示例、方法说明、使用场景以及注意事项等信息分门别类地列在表格中。比如,每个导航操作(如back(), forward(), refresh())作为一行,包含对应的代码、说明等列。 然后,我需要选择合适的Python库来生成Excel文件。常用的库有openpyxl和pandas。考虑到用户可能希望代码简单明了,使用pandas可能更方便,因为它可以用DataFrame直接构建数据并导出为Excel,代码更简洁。而openpyxl更适合需要复杂格式调整的情况,但在这里简单结构可能pandas更合适。 另外,用户可能希望Excel文件中的信息要清晰,有表头,不同的部分用不同的工作表(sheet)分开。例如,基础导航操作、核心方法、综合示例等各自在不同的sheet里。但根据用户当前的需求,可能一个sheet就足够了,或者需要分多个sheets,但需要看之前的回答结构。之前的回答分成了几个部分,如基础导航操作、核心操作方法、综合应用示例等,可能需要将这些内容分别放在不同的sheets中。 不过,用户现在的提问是将“详细代码说明生成excel文件”,可能更倾向于将代码示例和说明以结构化的方式放在表格里,而不是分多个sheets。需要保持简单,可能一个sheet包含所有信息,或者分几个相关的sheets。 另外,需要注意代码中的特殊字符,比如在Excel中可能需要处理换行符,确保代码块在单元格中正确显示。可能需要设置单元格的格式为文本,或者调整行高列宽以适应内容。 然后,我要考虑用户是否熟悉Python库的使用,是否需要给出安装相关库的指令,比如pandas和openpyxl,因为pandas在导出Excel时通常依赖openpyxl或xlsxwriter作为引擎。所以需要在代码中提示安装这些库,并在代码中指定引擎。 此外,用户可能需要生成的Excel文件包含哪些具体内容。回顾之前的回答,有代码块、说明、注意事项等。需要将这些内容拆解到Excel的不同列中,例如:功能分类、方法名称、代码示例、说明、注意事项等。 可能的列包括: - 功能分类(如导航操作、页面刷新、历史记录控制) - 方法/函数(如driver.get(), driver.back()) - 代码示例 - 说明 - 使用场景 - 注意事项 这样用户可以在Excel中快速查找不同功能对应的代码和说明。例如,在核心操作方法中,地址栏操作包括driver.get()和execute_script的方式,这些可以作为不同的行,分别列出代码示例和说明。 接下来,我需要将之前的回答内容结构化,转化为DataFrame的数据。例如: 功能分类 | 方法/函数 | 代码示例 | 说明 | 使用场景 | 注意事项 --- | --- | --- | --- | --- | --- 地址栏操作 | driver.get() | driver.get("https://www.baidu.com") | 跳转到指定URL | 需要加载新页面时使用 | 推荐使用这种方式 地址栏操作 | driver.execute_script() | driver.execute_script("window.location.href...") | 使用JS跳转URL | 需要执行JavaScript时使用 | 可能不如get()稳定 页面刷新 | driver.refresh() | driver.refresh() | 刷新当前页面 | 页面需要重新加载时 | 直接调用方法 历史记录控制 | driver.back() | driver.back() | 返回上一页 | 模拟浏览器后退按钮 | 需要历史记录存在 历史记录控制 | driver.forward() | driver.forward() | 前进到下一页 | 模拟浏览器前进按钮 | 需要之前执行过后退操作 类似这样的结构,将每个代码示例和说明填入表格中。然后使用pandas将这些数据写入Excel文件。 此外,用户可能需要综合应用示例部分也被包含在Excel中,可能需要单独的工作表,或者作为另一个部分。例如,综合示例可以作为另一个sheet,展示代码流程。 同时,用户可能希望生成的Excel文件有清晰的标题,适当的格式,比如加粗标题行,调整列宽等。虽然使用pandas导出可能默认没有格式,但至少确保内容正确,用户可以根据需要自行调整格式。 最后,还需要考虑代码的健壮性,比如处理文件路径问题,确保文件可以被正确保存,并且提示用户安装必要的库。例如,在代码开头检查是否安装了pandas和openpyxl,或者给出安装命令。 总结步骤: 1. 安装必要的库:pandas和openpyxl。 2. 结构化之前的代码说明为DataFrame,分列存储信息。 3. 使用pandas的ExcelWriter将数据写入Excel文件的不同工作表。 4. 处理代码中的换行和格式,确保在Excel中正确显示。 5. 提供完整的代码示例,用户可以直接运行生成Excel文件。 6. 在回答中解释代码的结构,并说明如何查看生成的Excel文件。 现在需要将这些思考转化为具体的代码实现,并确保代码正确生成所需的Excel文件,同时解释清楚每个步骤的作用,让用户能够理解和使用。</think>以下是使用PythonSelenium浏览器导航功能的代码说明生成Excel文件的完整解决方案: --- ### 一、环境准备 ```bash # 安装依赖库 pip install pandas openpyxl ``` --- ### 二、代码实现 ```python import pandas as pd from datetime import datetime # 创建数据结构 data = { "功能分类": [ "基础导航", "地址栏操作", "地址栏操作", "页面刷新", "页面刷新", "历史控制", "历史控制", "高级功能", "高级功能" ], "方法名称": [ "浏览器初始化", "driver.get()", "execute_script()", "driver.refresh()", "快捷键刷新", "driver.back()", "driver.forward()", "标签页操作", "网络监听" ], "代码示例": [ """driver = webdriver.Chrome(service=Service(...))""", """driver.get("https://example.com")""", """driver.execute_script("window.location.href=...")""", """driver.refresh()""", """body.send_keys(Keys.F5)""", """driver.back()""", """driver.forward()""", """driver.execute_script("window.open()")""", """driver.execute_cdp_cmd('Network.enable', {})""" ], "参数说明": [ "需指定chromedriver路径", "直接加载目标URL", "通过JavaScript修改地址", "无参数", "需要焦点在页面元素", "无参数", "无参数", "实现多标签页管理", "配合DevTools使用" ] } # 转换为DataFrame df = pd.DataFrame(data) # 添加时间戳 timestamp = datetime.now().strftime("%Y%m%d_%H%M") filename = f"selenium_navigation_guide_{timestamp}.xlsx" # 生成Excel文件 with pd.ExcelWriter(filename, engine='openpyxl') as writer: # 主功能表 df.to_excel(writer, sheet_name='功能索引', index=False) # 代码示例表 examples = { "完整初始化代码": [ "from selenium import webdriver", "from selenium.webdriver.chrome.service import Service", "driver = webdriver.Chrome(service=Service('chromedriver.exe'))" ], "典型操作流程": [ "driver.get('https://baidu.com')", "driver.back()", "driver.refresh()", "driver.forward()" ] } for sheet_name, code_list in examples.items(): pd.DataFrame({"代码段": code_list}).to_excel( writer, sheet_name=sheet_name, index=False ) # 自动调整列宽 from openpyxl import load_workbook wb = load_workbook(filename) for sheet in wb.sheetnames: ws = wb[sheet] for col in ws.columns: max_length = 0 column = col[0].column_letter for cell in col: try: if len(str(cell.value)) > max_length: max_length = len(str(cell.value)) except: pass adjusted_width = (max_length + 2) * 1.2 ws.column_dimensions[column].width = adjusted_width wb.save(filename) print(f"文件已生成:{filename}") ``` --- ### 三、文件结构说明 生成的文件包含以下工作表: 1. **功能索引表**: - 功能分类:导航操作的类型 - 方法名称:具体的API方法 - 代码示例:核心代码片段 - 参数说明:关键参数注意事项 2. **完整初始化代码**: - 包含浏览器初始化的完整代码模板 3. **典型操作流程**: - 展示从打开页面到导航操作的完整链条 --- ### 四、文件效果示例 | 功能分类 | 方法名称 | 代码示例 | 参数说明 | |-----------|----------------|---------------------------------------|-----------------------| | 地址栏操作| driver.get() | driver.get("https://example.com") | 直接加载目标URL | | 历史控制 | driver.back() | driver.back() | 需要存在浏览历史 | --- ### 五、高级功能扩展 可以添加以下增强功能: 1. **超链接支持**: ```python # 在单元格添加公式 df["参考文档"] = '=HYPERLINK("https://selenium.dev", "官方文档")' ``` 2. **条件格式化**: ```python from openpyxl.formatting.rule import FormulaRule # 标记重要方法 ws.conditional_formatting.add('B2:B100', FormulaRule(formula=['ISNUMBER(SEARCH("重要",C1))'], stopIfTrue=True, fill=PatternFill(bgColor="FFFF00"))) ``` --- ### 六、文件查看建议 1. 使用Excel的**筛选功能**快速定位特定方法 2. 利用**冻结窗格**固定标题行(视图 → 冻结窗格) 3. 通过**文本换行**显示完整代码(开始 → 自动换行) --- 如果需要定制更复杂的格式或添加可视化图表,可以进一步说明具体需求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值