您的位置:首页 > 编程语言 > Python开发

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就会发生变化,需要重新获取。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: