前言 最近有小伙伴提到,有写场景需要用到2个账号来回切换操作该如何解决。(备注:从v1.2.4以后新版本不再公开,新功能内部VIP学员可以使用,公开版本仅解决bug,不提供新功能了。) 先获取账号token 前面教程有讲到全局登录一次,后面所有的请求都会拿着全局登录的账号token去访问请求。现在需要新增2个账号,那我们只需要得到2个账号的token即可 conftest.py通过fixture去分别拿到test8和test9账号的token frompytest_yaml_yoyo.http_sessionimportHttpSession @pytest.fixture(scope=...

前言 在使用playwright执行代码的时候,如需设置代理,可以在启动的时候加proxy参数设置代理。本篇总结下可以加proxy代理的几种方式。 launch启动全局代理 launch启动的时候设置全局代理,以下是示例 fromplaywright.sync_apiimportPlaywright,sync_playwright withsync_playwright()asplaywright: browser=playwright.chromium.launch( headless=False,proxy={"server":"http://myproxy.com:3128"} )...

前言 当项目用例编写完成后,需设置执行策略,可以用到定时任务设置每天几点执行。或者间隔几个小时执行一次。 创建定时任务 创建任务 勾选需要执行的项目以及运行环境 触发器可以支持2种方式:interval间隔多久触发和cron表达式定时执行 方式1:interval触发器,间隔10分钟执行一次,单位是分钟 设置开启时间和结束时间 方式2:cron表达式定时执行,有5个值可以设置 1.minute059 2.hour023 3.day131 4.month112 5.day_of_week07 暂停重启和删除 任务列表可以看到每个任务的运行状态 点暂停按钮,暂停任务 任务暂停后...

前言 pytest-yaml测试平台用例结构是遵循pytest-yaml-yoyo框架用例规则。如果你之前已经有用pytest-yaml-yoyo框架完成了yaml用例的编写,可以直接在平台上导入yaml用例。 yaml用例 test_用例文件a.yml config: name:单个用例文件 test_a: name:extract提取结果 request: method:POST url:http://httpbin.org/post json: username:test password:"123456" extract: url:body.url validate: eq:[st...

前言 通常我们可以通过raise抛出一个HTTPException异常,请求参数不合法会抛出RequestValidationError异常,这是最常见的2种异常。 HTTPException异常 向客户端返回HTTP错误响应,可以使用 raise触发 HTTPException。 fromfastapiimportFastAPI,HTTPException app=FastAPI() @app.get("/path/{name}") asyncdefread_unicorn(name:str): ifname"yoyo": raiseHTTPException(4...

  iKXeBmqdRgYF   2023年11月19日   34   0   0 HTTPjsonicoicoHTTPjson

前言 requests响应头部在转json时,想格式化输出,结果报错TypeError:ObjectoftypeCaseInsensitiveDictisnotJSONserializable 报错详情 示例代码 importrequests importjson 上海悠悠wx:283340479 blog: r=requests.get('http://httpbin.org/get') print(r.headers) print(json.dumps(r.headers,indent=4)) 运行后报错 {'Date':'Mon,25Sep202311:32:31GMT','C...

  iKXeBmqdRgYF   2023年11月19日   33   0   0 jsonAccessAccessPythonjsonpython

前言 使用datetime日期类型时,想格式化成自定义的"%Y-%m-%d%H:%M:%S"格式 datetime类型 frompydanticimportBaseModel fromdatetimeimportdatetime classUserInfo(BaseModel): id:int name:str create_time:datetime=datetime.now() user=UserInfo({"id":1,"name":"yoyo"}) print(user.json()) 转json格式,输出结果 {"id":1,"name":"yoyo","create_t...

对同一个访问函数设置多个http请求方式 api_route使用 使用methods参数设置请求方式 fromfastapiimportFastAPI app=FastAPI() @app.api_route('/demo/b',methods=['get','post']) asyncdefdemo2(): return{"msg":"demo2success"} 判断请求方式执行不同内容 判断请求方式,执行不同内容 @app.api_route('/m',methods=['get','post']) asyncdefview_methods(request:Request...

  iKXeBmqdRgYF   2023年11月19日   41   0   0 参数设置FastAPIFastAPI参数设置

前言 前面一篇已经介绍在用例中可以查询以及在断言中实现sql,本篇讲解在用例的前置和后置操作中执行sql配置mysql环境,参考前面一篇有2内置的函数可以使用 query_sql(sql)查询sql,查询无结果返回[],查询只有一个结果返回dict,查询多个结果返回List[dict] execute_sql(sql)执行sql,操作新增,修改,删除的sql 按步骤执行sql 方案一:可以对测试用例,加一个步骤,这样就可以实现在接口的请求前或请求后执行sql 请求前执行sql,执行sql的函数随便定义一个关键字,比如print,variables,extract它都会去执行函数 conf...

前言 用过Flask-SQLAlchemy的应该知道,它提供了一个分页查询方法paginate(),方便我们实现在后端查询分页。但是单独使用SQLAlchemy却没有paginate方法,会报错:AttributeError:'Query'objecthasnoattribute'paginate' SQLAlchemy没有paginate方法 Flask-SQLAlchemy分页查询参考在SQLAlchemy中单独使用paginate方法 query_objs=session.query(Project) page_objs=query_objs.paginate( page=1, per...

前言 pydantic可以使用EmailStr校验邮箱格式 环境准备 EmailStr需按依赖包ImportError:email-validatorisnotinstalled,runpipinstallpydantic[email] pipinstallpydantic[email] 校验邮箱格式 frompydanticimportBaseModel,EmailStr,validator fromtypingimportOptional classUser(BaseModel): name:str age:int email:EmailStr tel:Optional[str]...

前言 页面上一闪而过的提示语,一般出现1-3秒就会消失,这种消息框如何定位呢? 示例 如下操作成功的提示语 它过1-3秒就自动消失了,按下f12,鼠标还没指上去就不见了,无法获取它的元素属性。 误区:首先这不是标准的alert,所以不能用dialog事件监听(很多初学者分不清alert和弹出消息框) 调试暂停 F12后点开源代码,然后点暂停按钮 这时候页面处于调试暂停状态了 再回到检测元素,鼠标指上去,就能看到元素属性了 代码示例 断言消息框内容,可以直接用expect断言 fromplaywright.sync_apiimportsync_playwright,expect ...

前言 网页上的元素有不同状态,有些元素本来不在DOM里,点击某个按钮后才出现。有些元素是本来就已经在DOM里是隐藏的状态,点某个按钮后才变成显示状态。如果我们想让元素到达指定的状态再下一步操作,可以用page.wait_for_selector()方法。 page.wait_for_selector()方法 wait_for_selector()方法部分源码 defwait_for_selector( self, selector:str, , timeout:typing.Optional[float]=None, state:typing.Optional[ Literal["attac...

前言 page.goto()可以通过浏览器直接发get请求,playwright也可以支持通过浏览器发送post请求。 page.goto()使用 page.goto()访问网站的时候,实际上是有返回值的,可以获取到response对象 fromplaywright.sync_apiimportsync_playwright,expect withsync_playwright()asp: browser=p.chromium.launch(headless=False) context=browser.new_context() page=context.new_page() re...

前言 Pywinauto是基于Python开发的,用于自动化测试的脚本模块,主要操作于Windows标准图形界面。它可以允许你很容易的发送鼠标、键盘动作给Windows的对话框和控件。官网地址https://pywinauto.readthedocs.io/en/latest/index.html中文文档地址https://www.kancloud.cn/gnefnuy/pywinauto_doc/1193035 环境准备 可以通过命令行安装pywinauto: pipinstallpywinauto 安装完成后,可以执行以下代码,检测是否正确安装 frompywinauto.appli...

前言 pywinauto操作GUI应用程序上的元素,需先找到指定窗口,基于窗口查找框架再操作。 如何查看窗口信息? 当前面启动记事本后,可以通过inspect.exe查看窗口信息 主要看2个属性,窗口的标题,也就是左上角我们看到的 还有一个是查看的class属性,只能通过工具查看 可以通过标题和class属性,连上窗口 示例1:通过标题连上窗口 frompywinautoimportApplication app=Application('uia').start("notepad.exe") w=app['无标题记事本'] 示例2:通过className属性 frompyw...

前言 桌面应用的操作都是基于控件操作,先找到对应的窗口,基于操控查找框架即可操作了。 查看窗口控件 先学会如何查看窗口框架,可以用inspect.exe查看窗口的层级结构 以打开的记事本为例 也可以通过print_ctrl_ids()方法(另外一个print_control_identifiers()功能一样)查看当前窗口下的控件 frompywinautoimportApplication importtime app=Application('uia').start("notepad.exe") win=app.window(title_re="无标题记事本") 获取当前窗口下控...

前言 pywinauto使用menu_select()方法操作级联菜单控件。 操作级联菜单 点帮助(H)-关于记事本(A) 操作代码 frompywinautoimportApplication app=Application('uia').start("notepad.exe") win=app.window(title_re="无标题记事本") 操作级联菜单 win.menu_select('帮助(H)->关于记事本(A)') 操作后会看到弹出关于界面

前言 pywinauto操作弹出新窗口上的按钮 操作新窗口 frompywinautoimportApplication app=Application('uia').start("notepad.exe") win=app.window(title_re="无标题记事本") 操作级联菜单 win.menu_select('帮助(H)->关于记事本(A)') 点关于后弹出新窗口,现在需要点确定按钮 通过标题关于“记事本”定位到新窗口 然后点确定按钮 代码示例 frompywinautoimportApplication app=Application('uia')....

前言 控件操作完成后,一般需要获取控件的属性对结果断言,判断是否符合预期。 查看控件类型 wrapper_object()方法可以查看控件类型 frompywinautoimportApplication app=Application('uia').start("notepad.exe") win=app.window(title_re="无标题记事本") m=win.child_window(title="帮助(H)",control_type="MenuItem") print(win.wrapper_object()) print(m.wrapper_object()) 运...

关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~