python + selenium + chrome 在实现back,forward,refresh时的注意事项
2018-02-06 11:15
681 查看
python + selenium + chrome 在实现back,forward,refresh时的注意事项
1. 背景
在使用selenium模拟浏览器时,经常会使用到导航栏的三个按钮:后退,前进,刷新。来达到在浏览过的页面之间进行切换。对应到selenium中的方法分别是:back(),forward(), refresh() 。但是如果直接使用之前定位到的元素,会出现一个问题,那就是:元素失焦。2. 环境
python 3.6.1系统:win7
IDE:pycharm
安装过chrome浏览器
配置好chromedriver
selenium 3.7.0
3. 代码解析
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.keys import Keys from selenium.webdriver.suppor bd4f t.ui import Select import time import random # 加载xpath插件 chrome_options = webdriver.ChromeOptions() extension_path = 'D:/extension/XPath-Helper_v2.0.2.crx' chrome_options.add_extension(extension_path) browser = webdriver.Chrome(chrome_options=chrome_options) # browser.maximize_window() wait = WebDriverWait(browser, 25) waitPopWindow = WebDriverWait(browser, 25) firstUrl = "https://www.taobao.com/" browser.get(firstUrl) time.sleep(random.randrange(3, 5, 1)) # 第一次获取 淘宝 输入框 searchInput = browser.find_element_by_xpath("//input[@id='q' and @class='search-combobox-input']") print(f"searchInputBefore = {searchInput}") searchInput.click() searchInput.send_keys("abcTest") time.sleep(random.randrange(3, 5, 1)) # 第一种测试:back() # 进入amazon网站 secondUrl = "https://www.amazon.com/" browser.get(secondUrl) time.sleep(random.randrange(3, 5, 1)) # 返回淘宝主页 browser.back() # 第二种测试:refresh() # browser.refresh() time.sleep(random.randrange(3, 5, 1)) # 第二次获取 淘宝 输入框 searchInput = browser.find_element_by_xpath("//input[@id='q' and @class='search-combobox-input']") print(f"searchInputAfter = {searchInput}") searchInput.send_keys("abcTest") time.sleep(random.randrange(3, 5, 1)) # 再次前进到 amazon主页 browser.forward() print(f"演示结束") time.sleep(random.randrange(3, 5, 1)) browser.quit()
结果显示,对前后的两个淘宝页面来说,输入框的ID是不同的,旧的元素无法继续使用。
同样的,当页面进行refresh之后,元素的ID也会发生变化。
searchInputBefore = <selenium.webdriver.remote.webelement.WebElement (session="1adae9c334324c3e9137796ea16fdc12", element="0.7525547144214484-1")> searchInputAfter = <selenium.webdriver.remote.webelement.WebElement (session="1adae9c334324c3e9137796ea16fdc12", element="0.746747334537434-1")> 演示结束
如果把 line:49行 注释掉,就会出现如下的情况:
Traceback (most recent call last): File "E:/PyCharmCode/amazonSearchClick/test.py", line 48, in <module> searchInput.send_keys("abcTest") File "E:\Miniconda\lib\site-packages\selenium\webdriver\remote\webelement.py", line 352, in send_keys 'value': keys_to_typing(value)}) File "E:\Miniconda\lib\site-packages\selenium\webdriver\remote\webelement.py", line 501, in _execute return self._parent.execute(command, params) File "E:\Miniconda\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 308, in execute self.error_handler.check_response(response) File "E:\Miniconda\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 194, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document (Session info: chrome=63.0.3239.132) (Driver info: chromedriver=2.34.522940 (1a76f96f66e3ca7b8e57d503b4dd3bccfba87af1),platform=Windows NT 6.1.7601 SP1 x86_64)
也就是说,只要页面发生过变动,重新加载了元素,那么元素的ID就会发生变化,需要重新获取。
相关文章推荐
- selenium之 浏览器导航栏的三个按钮(back、forward、refresh)
- [Python爬虫] Selenium自动访问Firefox和Chrome并实现搜索截图
- python+selenium调用浏览器(IE-Chrome-Firefox)实现爬虫功能
- redis安装 phpredis Jedis 扩展的实现及注意事项,php,java,python相关插件安装实例代码和文档推荐
- 使用swipebacklayout实现ios右滑退出效果及注意事项
- Python数据库的连接实现方法与注意事项
- 在Linux下实现Python+selenium+chrome的web自动化测试
- Linux配置Selenium+Chrome+Python实现自动化测试
- Python数据库的连接实现方法与注意事项
- Ultra Pull To Refresh实现知乎下拉刷新风格注意事项
- python + selenium + chrome 如何打开新窗口,并实现窗口切换
- 使用Xvfb实现无界面Selenium自动化测试注意事项
- 【Python】Python实现进制转换(二进制、十进制和十六进制)及注意事项
- Python简单实现产生随机位数的密码及注意事项小结
- selenium之 浏览器导航栏的三个按钮(back、forward、refresh)
- [Python爬虫] Selenium自动访问Firefox和Chrome并实现搜索截图
- 【Python3.6爬虫学习记录】(七)使用Selenium+ChromeDriver爬取知乎某问题的回答
- 基于php实现长连接的方法与注意事项的问题
- linux环境下的mysql-python使用注意事项
- python(selenium)使用chrome驱动问题小记