为解决脚本执行和调试得过程中重复登录得问题,可采用复用浏览器得方式,跳过前面得自动化执行步骤,轻松复现出问题。
1.复用浏览器
1.退出所有浏览器:windows需要关闭浏览器进程
2.配置谷歌浏览器的环境变量
获取启动路径:
设置环境变量
3.重启命令行,输入命令
chrome --remote-debugging-port=9222
可以启动浏览器,说明配置正确
MAC电脑:
- 获取启动路径(注意:使用 tab 键,不要手动输入)
- 将启动路径配置到环境变量中
举例,地址自拟 export PATH=$PATH:/Applications/Google\ Chrome.app/Contents/MacOS
配置好环境,当执行代码报错时执行以下代码,直接调试即可
from selenium.webdriver.chrome.options import Options
option = Options()
option.debugger_address = "localhost:9222"
self._driver = webdriver.Chrome(options=option)
driver.find_element(By.id,'username').send_keys('jjj')
2.cookie复用
具体实现方法为:
- 1.登录后获取cookie信息:
driver.get_cookies()
- 2.保存cookie信息到文件:
with open("cookies.yaml","w") as f:
yaml.safe_dump(cookie,f)
- 3.使用时从文件读取,按键值对添加cookie
# 从文件中获取cookies
cookie = yaml.safe_load(open("cookie.yaml"))
# 3. 植入cookie
for c in cookie:
self.drvier.add_cookie(c)
- 4.重新打开网页
driver.get("www.baidu.com")
利用显示等待来操作登录,cookie过期时扫码登录后获取心得cookie,未过期时采用保存得cookie获取登录信息
def setup_class(self):
with allure.step("打开企微首页"):
self.driver = webdriver.Chrome()
self.driver.implicitly_wait(3)
self.driver.get("https://work.weixin.qq.com/wework_admin/frame#index")
# 定义获取token显式等待函数,返回应是函数对象,而不是函数调用
def is_login(element):
flag = False
def inner(driver):
# 使用历史cookies文件登录
nonlocal flag
print(flag)
if not flag:
cookies = yaml.safe_load(open("cookies.yml"))
for cook in cookies:
driver.add_cookie(cook)
driver.get("https://work.weixin.qq.com/wework_admin/frame#index")
# 使用定位首页某个元素判断是否登录成功,登录失败,将重置cookies文件标志置位
# 定位不到返回为空列表
locator = driver.find_elements(By.CSS_SELECTOR, element)
if not locator:
flag = True
# 当需要重置cookies文件和首页均为True时,保存新的cookies,即cookies失效后重置
if flag and locator:
cookies = driver.get_cookies()
with open("./cookies.yml", "w") as f:
yaml.safe_dump(cookies, f)
return locator
return inner
with allure.step("cookie载入"):
# until函数传入的是函数对象,而不是函数调用,此处传入的是is_login返回的内函数对象
WebDriverWait(self.driver, 15).until(is_login(".index_explore_title"))