目录
- Selenium简介
- Selenium IDE
- 使用remote复用已有的浏览器
- 使用cookie登录
问题整理
- chromedriver的配置问题。
- 下载浏览器对应的driver版本
- chromedriver配置环境变量
- 重启命令行以及pycharm
- 学会找报错信息,以及理解报错信息的含义
Selenium
- Selenium is a suite of tools to automate web browsers across many platforms
- runs in many browsers and operating systems
- can be controlled by many programming languages and testing frameworks
- 官网:https://www.selenium.dev/selenium/docs/api/py/
Selenium IDE的缺点(不推荐)
- 生成大量冗余代码,比如导入,滑入,滑出等等
- 实现复杂的业务逻辑,比如 加入if,else 逻辑处理,不方便
- 录制出来的用例不够完整, 没有断言
复用浏览器操作
- 概念:使用已打开的浏览器进行操作
- 浏览器
需要退出当前所有的谷歌浏览器(特别注意)
-
找到chrome的启动路径
-
配置环境变量
启动命令windows:chrome --remote-debugging-port=9222
启动命令mac:Google\ Chrome --remote-debugging-port=9222
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome - -remote-debugging-port=9222
注意:使用tab键,不要手动输入
windows 找到chrome 路径
- python
chrome_arg = webdriver.ChromeOptions()
chrome_arg.debugger_address='127.0.0.1:9222'
self.driver = webdriver.Chrome(options=chrome_arg)
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
class TestWX:
def setup(self):
"""
复用浏览器
"""
option = Options()
"""
注意:
1. 浏览器要提前打开
2. 9222端口要与命令行启动的端口一致
"""
option.debugger_address = "127.0.0.1:9222"
self.driver = webdriver.Chrome(options=option)
self.driver.maximize_window()
self.driver.implicitly_wait(5)
def teardown(self):
self.driver.quit()
def test_wx(self):
self.driver.get("https://work.weixin.qq.com/wework_admin/frame#index")
self.driver.find_element(By.ID, 'menu_contacts').click() # 点击通讯录
使用cookie登录
- 什么是cookie
- Cookie是一些数据,存储于你电脑上的文本文件中
- 当web服务器向浏览器发送web页面时,在连接关闭后,服务端不会记录用户的信息
- Cookie解决“如何记录客户端的用户信息”
- 获取cookie
driver.get_cookies()
def test_cookie(self):
# 获取当前页面的cookies
cookies = self.driver.get_cookies()
print(cookies)
# 将每个cookie放在当前的页面上
for cookie in cookies:
"""add_cookie方法传入字典类型,且关键字的值不能为float类型,所以应将cookie中的到期时间去掉"""
if "expiry" in cookie.keys():
cookie.pop("expiry")
self.driver.add_cookie(cookie)
self.driver.refresh() # 刷新页面
- 存储cookie,使用Python自带的小型数据库shelve
- shelve存储类型为
key:value
形式 - 打开数据库:
shelve.open("文件名")
- 传入数据:
db["key"] = value
- 关闭数据库:
db.close()
- 注意,数据传入后,db文件就会生成,此时就应把
db["key"] = value
代码注释掉
- shelve存储类型为
def test_shelve(self):
"""shelve 是Python自带的对象持久化存储小型数据库
以key:value形式存储
"""
db = shelve.open("cookies") # 生成cookies.db 文件
# db["cookie"] = self.driver.get_cookies() # 获取cookie后将此代码注释
cookies = db["cookie"]
db.close() # 关闭数据库
# 打开新页面
self.driver.get("https://work.weixin.qq.com/wework_admin/frame#index")
# 加入cookie
for cookie in cookies:
if "expiry" in cookie.keys():
cookie.pop("expiry")
self.driver.add_cookie(cookie)
self.driver.refresh() # 刷新页面
实例:企业微信导入联系人功能
def test_import_contacts(self):
# shelve 模块, python 自带的对象持久化存储
db = shelve.open('cookies')
cookies = db['cookie']
db.close()
# 打开无痕新页面
self.driver.get("https://work.weixin.qq.com/wework_admin/frame#index")
# 加入cookie
for cookie in cookies:
if 'expiry' in cookie.keys():
cookie.pop('expiry')
self.driver.add_cookie(cookie)
# 刷新当前页面,获取登录状态
self.driver.refresh()
# 点击【导入联系人】
self.driver.find_element(By.CSS_SELECTOR, ".index_service_cnt_itemWrap:nth-child(2)").click()
# 上传文件,选择文件的完整路径上传
self.driver.find_element(By.CSS_SELECTOR, ".ww_fileImporter_fileContainer_uploadInputMask").send_keys(
"/Users/juanxu/Downloads/mydata.xlsx")
# 断言上传文件名,与实际文件名一致
result = self.driver.find_element(By.CSS_SELECTOR, ".ww_fileImporter_fileContainer_fileNames").text
assert "mydata.xlsx" == result
sleep(5)