cookie登录:
- 第一次登录一个域名,网站会在 Response Header 中加入 Set-Cookie 头
- Browser 会保存 Cookie 与 Domain
- 再次发起对相同domain的请求的时候,Browser 会把 Domain 对应的 Cookie 以 Cookie 头的格式发送给对应的 Domain
#response set cookie
set-cookie: wwrtx.i18n_lan_key=zh-CN%2Czh%3Bq%3D0.9%2Cen-US%3Bq%3D0.8%2Cen%3Bq%3D0.7; Path=/; Expires=Tue, 03 Sep 2019 06:19:15 GMT
set-cookie: wwrtx.i18n_lan=zh-cn; Path=/; Expires=Tue, 03 Sep 2019 06:19:15 GMT
set-cookie: wwrtx.ref=direct; Domain=.work.weixin.qq.com; Path=/; HttpOnly
set-cookie: wwrtx.refid=18553809571155839; Domain=.work.weixin.qq.com; Path=/; HttpOnly
#第二次reqeust
cookie: wwrtx.i18n_lan_key=zh-CN%2Czh%3Bq%3D0.9%2Cen-US%3Bq%3D0.8%2Cen%3Bq%3D0.7; wwrtx.i18n_lan=zh-cn; wwrtx.ref=direct; wwrtx.refid=18553809571155839; _ga=GA1.2.1434878657.1564899555; _gid=GA1.2.358486227.1564899555
#登录
set-cookie: wwrtx.vst=bwwJzXzX7P30bdCMNff5DBmaUIkdDUQZYG-ynNp8Oi1d87eZZpJv8t-obxiDtpDRbKkRYnjHAbrvkZEeAlRqqcgXmuT1u24LsC7F1HkwrYmlU-zyg1d4vgzEM2jCVmUFD02KuvHf60UpRWs3WGzQ4pS-pc32aM0w7BTNKVE9srAU8jMWxrjgllRJlItc_ap3nKajZLdOVbrEUHw2kRiUn18BMwWNSo1-h2E4dkh5CmZ52AdZjhb_qOXYjQZjeVoC5yajQL041wAFbgkoRvGk5Q; Domain=.work.weixin.qq.com; Path=/; HttpOnly
set-cookie: wwrtx.d2st=a1678792; Domain=.work.weixin.qq.com; Path=/
set-cookie: wwrtx.sid=PvmFAAW3_ZQOnOfp5SzMi8wH6yHkmO-qU5JS55P3PM0Q8lrAI_GgrlcwvKitXKHf; Domain=.work.weixin.qq.com; Path=/; HttpOnly
set-cookie: wwrtx.ltype=1; Domain=.work.weixin.qq.com; Path=/; HttpOnly
set-cookie: wwrtx.tsid=; Domain=.work.weixin.qq.com; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; HttpOnly
set-cookie: wwrtx.tsid=; Domain=.work.weixin.qq.com; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; HttpOnly
set-cookie: wwrtx.gst=; Domain=.work.weixin.qq.com; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; HttpOnly
set-cookie: wxpay.corpid=1970325013047104; Domain=.work.weixin.qq.com; Path=/
set-cookie: wxpay.vid=1688853941438590; Domain=.work.weixin.qq.com; Path=/
#登录后发起请求
cookie: wwrtx.i18n_lan_key=zh-CN%2Czh%3Bq%3D0.9%2Cen-US%3Bq%3D0.8%2Cen%3Bq%3D0.7; wwrtx.i18n_lan=zh-cn; wwrtx.ref=direct; wwrtx.refid=18553809571155839; _ga=GA1.2.1434878657.1564899555; _gid=GA1.2.358486227.1564899555; wwrtx.vst=bwwJzXzX7P30bdCMNff5DBmaUIkdDUQZYG-ynNp8Oi1d87eZZpJv8t-obxiDtpDRbKkRYnjHAbrvkZEeAlRqqcgXmuT1u24LsC7F1HkwrYmlU-zyg1d4vgzEM2jCVmUFD02KuvHf60UpRWs3WGzQ4pS-pc32aM0w7BTNKVE9srAU8jMWxrjgllRJlItc_ap3nKajZLdOVbrEUHw2kRiUn18BMwWNSo1-h2E4dkh5CmZ52AdZjhb_qOXYjQZjeVoC5yajQL041wAFbgkoRvGk5Q; wwrtx.d2st=a1678792; wwrtx.sid=PvmFAAW3_ZQOnOfp5SzMi8wH6yHkmO-qU5JS55P3PM0Q8lrAI_GgrlcwvKitXKHf; wwrtx.ltype=1; wxpay.corpid=1970325013047104; wxpay.vid=1688853941438590
隐式等待: 服务端会帮你轮询查找,全局性的
显式等待:客户端轮询查找 每找一次元素,等待一个间隔再次查找,知道条件匹配,一次性的
sleep:不建议,不稳定,网速差的会超过你的写死的等待时间,设置的大又会导致在网速好的时候,所有的用例都被拖慢速度。
一个简单的封装:
def click_and_find(x):
self.click_by_js(*self._add)
return len(x.find_elements(By.XPATH, '//*[text()="取消"]'))>=1
WebDriverWait(self._driver, 5).until(click_and_find)
PageObject
参考文档
- 2013 Martin Flower https://martinfowler.com/bliki/PageObject.html
- 2015 Selenium https://github.com/SeleniumHQ/selenium/wiki/PageObjects
- Selenium Python Client https://selenium-python.readthedocs.io/page-objects.html
- Mozilla PyPOM https://pypom.readthedocs.io/en/latest/
PO原则
The public methods represent the services that the page offers
Try not to expose the internals of the page
Generally don’t make assertions
Methods return other PageObjects
Need not represent an entire page
Different results for the same action are modelled as different methods
方法意义
用公共方法代表UI所提供的功能
比如,一个页面,包括添加成员、删除成员、通讯录等等,则 class ContactPage 类下就应该命名为 def add_member、def delete_member、 def contact
class ContactPage:
def add_member(self):
pass
def def delete_member(self):
pass
def contact(self):
pass
方法应该返回其他的PageObject或者返回用于断言的数据
同样的行为不同的结果可以建模为不同的方法 不要在方法内加断言 字段意义
不要暴露页面内部的元素给外部
不需要建模UI内的所有元素