自动化测试需要二维码登录,怎么办?

参考链接

  • selenium 官网:
    https://seleniumhq.github.io/selenium/docs/api/py/

第一个录制出来的代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Generated by Selenium IDE
import pytest
import time
import json
from selenium import webdriver
from selenium.webdriver.common.by import By

class TestTesta():
    def setup_method(self, method):
        # 打开浏览器
        self.driver = webdriver.Firefox()

    def teardown_method(self, method):
        # 退出浏览器
        self.driver.quit()

    def test_testa(self):
        # 打开网址
        self.driver.get("https://ceshiren.com/")
        # 设置浏览器尺寸
        self.driver.set_window_size(1421, 840)
        # 点击所有分类
        self.driver.find_element(By.LINK_TEXT, "所有分类").click()

不建议使用录制出来的代码

1、录制的代码,冗余的代码太多,需要改造
2、没有加入断言,需要手动添加

等待方式

1、强制等待
time.sleep(second) ,死等,直到设置的 second 秒 数结束

2、隐式等待

self.driver.implicitly_wait(5) 一般编写测试用例的时候都要加入隐式等待。
一般是在创建完driver 之后立刻设置隐式等待,会存在 driver 的整个生命周期当中。

每次查找元素的时候会动态的等待元素的出现 。

3、显式等待

在某一个元素上动态的查找。

参考代码


    def test_weixin(self):
        self.driver.get("https://work.weixin.qq.com/wework_admin/loginpage_wx?from=myhome")
        # time.sleep(10)
        # print(self.driver.get_cookies())
        # 获取当时的cookie
        cookies = [{'domain': '.work.weixin.qq.com', 'httpOnly': False, 'name': 'wwrtx.vid', 'path': '/', 'secure': False, 'value': '1688851905935585'}, {'domain': '.work.weixin.qq.com', 'httpOnly': False, 'name': 'wxpay.vid', 'path': '/', 'secure': False, 'value': '1688851905935585'}, {'domain': '.work.weixin.qq.com', 'httpOnly': False, 'name': 'wxpay.corpid', 'path': '/', 'secure': False, 'value': '1970325054155915'}, {'domain': '.work.weixin.qq.com', 'httpOnly': False, 'name': 'wwrtx.d2st', 'path': '/', 'secure': False, 'value': 'a6117131'}, {'domain': 'work.weixin.qq.com', 'expiry': 1599668856, 'httpOnly': True, 'name': 'ww_rtkey', 'path': '/', 'secure': False, 'value': '2f3srko'}, {'domain': '.qq.com', 'expiry': 1599723726, 'httpOnly': False, 'name': '_gid', 'path': '/', 'secure': False, 'value': 'GA1.2.678795865.1599637322'}, {'domain': '.work.weixin.qq.com', 'httpOnly': True, 'name': 'wwrtx.refid', 'path': '/', 'secure': False, 'value': '3697355392520199'}, {'domain': '.work.weixin.qq.com', 'httpOnly': True, 'name': 'wwrtx.sid', 'path': '/', 'secure': False, 'value': 'IiwmHmbRQC3UgqmekvGcsr4MXoEQ7JHkRJxXLp6O6EJVsPqpC7XW76-bnVayBJEn'}, {'domain': '.work.weixin.qq.com', 'httpOnly': True, 'name': 'wwrtx.ltype', 'path': '/', 'secure': False, 'value': '1'}, {'domain': '.work.weixin.qq.com', 'httpOnly': True, 'name': 'wwrtx.ref', 'path': '/', 'secure': False, 'value': 'direct'}, {'domain': '.qq.com', 'expiry': 1599637381, 'httpOnly': False, 'name': '_gat', 'path': '/', 'secure': False, 'value': '1'}, {'domain': '.qq.com', 'expiry': 1662709326, 'httpOnly': False, 'name': '_ga', 'path': '/', 'secure': False, 'value': 'GA1.2.1244331351.1599637322'}, {'domain': '.work.weixin.qq.com', 'expiry': 1631173320, 'httpOnly': False, 'name': 'wwrtx.c_gdpr', 'path': '/', 'secure': False, 'value': '0'}, {'domain': '.work.weixin.qq.com', 'httpOnly': True, 'name': 'wwrtx.vst', 'path': '/', 'secure': False, 'value': 'TNtbVadLB1jEVX113Ypx3MzpTcRKBbZb27VmkZdFYA9KMtKb8HNFRHbbjFyOWu-YSq9QCYhbW8Pl5hbQpyU3LugnMhfU6ok9DsaryD9qj5VeB9pPs3oh24uEwH9Mf-inn_IjOFJLGd6VMflPPo21KQ-x8Uw_u_CxrAc1wpSJ4EaQ5D0RmOCKwesUtFHOoL6fMIGtqsaOiE_fJ-68puCQA-1W6Jzg29qmn8UJ8eLaCgr7s0yhl7VXltWiGI6niOqEufJms4bv4VziVFs8GwQCrg'}, {'domain': '.work.weixin.qq.com', 'expiry': 1602229329, 'httpOnly': False, 'name': 'wwrtx.i18n_lan', 'path': '/', 'secure': False, 'value': 'zh-cn'}]


        for cookie in cookies:
            self.driver.add_cookie(cookie)

        self.driver.refresh()
        # 使用find_element 方法定位元素,如果页面上有多个相同属性的元素,只能定位到第一个元素
        # self.driver.find_element(By.CSS_SELECTOR, ".index_service_cnt_item_title")
        # 使用 find_elements 方法 会返回一个元素列表
        element = self.driver.find_elements(By.CSS_SELECTOR, ".index_service_cnt_item_title")[1]
        element.click()

        self.driver.find_element(By.ID, "js_upload_file_input").\
            send_keys("/Users/juanxu/Downloads/mydata.xlsx")
        filename = self.driver.find_element(By.ID, "upload_file_name").text
        assert "mydata.xlsx" == filename
        time.sleep(10)