web控件定位

XPATH定位
‘//[@id=“s_tab”]//a[1]’ #定位到s_tab元素下面第一个a元素
'//
[@id=“u”]/a’ 和’//*[@id=“u”]//a’ #这里面一个斜杠和两个斜杠的区别是:一个斜杠表示子元素,两个斜杠表示的是下面的子子孙孙的元素
css selector
‘#kw’
‘#kw a’ #中间有一个空格(空格表示子子孙孙,如果是箭头表示子元素),表示id="kw"元素后面的a元素
‘#kw a:nth-child(2)’ #表示a元素的父元素下面的第二个元素
‘#kw a:nth-last-child(1)’ #表示a元素的父元素下面的倒数第一个元素

web控件交互官方文档:

https://selenium-python.readthedocs.io/api.html
ActionChains:执行PC端的鼠标点击,双击,右键,拖拽等事件,对H5页面操作无效
执行原理:调用ActionChains的方法时,不会被立即执行,而是将所有的操作,按顺序存放在一个队列里,当你调用perform()方法时,队列中的事件会依次执行
具体用法:执行PC端的鼠标点击,双击,右键,拖拽等事件
actions=ActionChains(driver)
actions.move_to_element(element)
actions.click(element)
actions.perform()
TouchAction:模拟PC和移动端的点击,滑动,拖拽,多点触控等多种手势操作,可以对H5进行操作
https://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.touch_actions
手势控制:
具体用法:
actions=TouchActions(driver)
action.tag(element)
action.perform()
表单操作
表单使用form标签,我们首先定位到表单元素,然后去操作元素(清空、输入或者点击等)

网页frame与多窗口处理

多窗口处理
点击某个链接,会重新打开一个窗口,对于这种情况,想在新页面操作,就得先切换窗口了
获取窗口的唯一标识用句柄表示,所以只要切换句柄,就可以在多个页面灵活操作了
处理的流程就是
1、先获取当前的窗口句柄(driver.current_window_handle)
2、再获取到所有的窗口句柄(driver.window_handles)
3、判断是否是想要操作的窗口,如果是,就可以对窗口进行操作,如果不是,跳转到另外一个窗口,对另外一个窗口进行操作(driver.switch_to.window(window[-1]))
frame处理
frame是html中的框架,在html中,所谓的框架就是可以在同一个浏览器中显示不止一个页面
frame标签包含frameset、frame、iframe三种
frameset和普通标签一样,不会影响正常的定位,可以使用id,name任意方式定位frame
selenium有一组方法对frame进行操作,frame存在两种,一种是嵌套的,一种是未嵌套的
切换frame:
driver.switch_to.frame() #根据元素id或者index切换frame
driver.switch_to.default_content() #切换到默认frame
driver.switch_to.parent_frame() #切换到父级frame
对于未嵌套的:
driver.switch_to_frame(“frame的id”)
driver.switch_to_frame(“frame-index”) #frame无ID的时候依据索引来处理,索引从0开始driver.switch_to_frame(0)
对于嵌套的:先进入到iframe的父节点,再进入到子节点,然后可以对子节点里面的对象进行处理和操作
driver.switch_to.frame(“父节点”)
driver.switch_to.frame(“子节点”)

selenium处理多浏览器

通过传递不同的参数来测试不同的浏览器,用来做浏览器兼容性测试
方法就是我们可以在setup方法中修改代码如下即可

    def setup(self):browser = os.getenv("browers")if browser == 'firefox':self.driver = webdriver.Firefox()else:self.driver = webdriver.Chrome()self.driver.get("https://www.baidu.com/")self.driver.maximize_window()

运行的过程中,传递浏览器参数即可,使用命令browser=chrome pytest 要运行的文件

执行javascript脚本

使用selenium直接在当前页面中进行js交互,那么如何调用js呢,我们可以使用execute_script方法

import time
from selenium import webdriver
class TestWindow():def setup(self):self.driver = webdriver.Chrome()self.driver.get("https://www.baidu.com/")self.driver.maximize_window()self.driver.implicitly_wait(5)def teardown(self):self.driver.quit()def test_window(self):self.driver.find_element_by_id("kw").send_keys("小米")ele = self.driver.execute_script("return document.getElementById('su')").click()self.driver.execute_script("document.documentElement.scrollTop=10000")time.sleep(3)

大部分的时间控件都是readonly属性,需要手动去选择对应的时间,处理时间控件的思路:
取消日期的readonly属性,再给value赋值,然后再使用webdriver对js进行处理

    def test_date(self):self.driver.get("https://www.12306.cn/index/")self.driver.execute_script("a=document.getElementById('train_date');a.removeAttribute('readonly')")self.driver.execute_script("document.getElementById('train_date').value='2021-03-08'")time.sleep(2)print(self.driver.execute_script("return document.getElementById('train_date').value"))

文件上传弹框处理

文件上传
input标签可以直接使用send_keys(文件地址)上传文件
用法:
el = driver.find_element_by_id(“上传按钮id”)
el.send_keys(“文件路径+文件名”)
弹窗处理机制
在页面操作中有时候会遇到JS所生成的alert、confirm以及prompt弹窗,可以使用switch_to.alert()方法定位到,然后使用text/accept/dismiss/send_keys等方法进行操作,我们可以通过定位元素分辨alert、window、div模态框
操作alert的常用方法:
switch_to.alert():获取当前页面的警告框
text:返回alert、confirm、prompt弹窗中的文字信息
accept():接受现有警告窗
dismiss():解散现有警告窗
send_keys(keysToSend):发送文本至警告窗。keysToSend将文本发送至警告窗

Page Object设计模式和原则

https://martinfowler.com/bliki/PageObject.html
https://www.selenium.dev/documentation/en/guidelines_and_recommendations/page_object_models/
六大原则:

  1. 公共的方法代表页面提供的服务
  2. 不需要暴露页面的交互细节
  3. 通常来说不要做断言
  4. 方法返回其他PO
  5. 不需要代表整个页面
  6. 相同的行为导致的不同结果,封装成不同的方法

使用remote复用已有的浏览器

在docs命令中开启调试,在此之前,需要把chrome关掉,使用命令
chrome --remote-debugging -port=9222,回车之后,会打开一个干净的浏览器,我们可以复用这个浏览器了
在代码这样编辑

  def setup_method(self, method):options = Options()#和浏览器打开的调试窗口进行通信#浏览器要使用--remote-debugging-port=9222options.debugger_address = "127.0.0.1:9222"self.driver = webdriver.Chrome(options=options)

使用cookie登录

浏览器复用是可以绕过登陆进行测试的,当然我们也可以使用cookie的方式,去真实的进行登录,然后进行测试

以企业微信登录为例,我们先使用浏览器复用打印下cookie

  def test_wework01(self):self.driver.get("https://work.weixin.qq.com/wework_admin/frame")print(self.driver.get_cookies())

运行结果如下:

也就是我们将要使用打印出来的这个cookie进行登录,我们可以把cookie存在一个虚拟的数据库里面,然后每次运行去获取我们cookie,代码如下:

class Test():def setup_method(self):options = Options()#和浏览器打开的调试窗口进行通信#浏览器要使用--remote-debugging-port=9222options.debugger_address = "127.0.0.1:9222"self.driver = webdriver.Chrome()def test_wework(self):self.driver.get("https://work.weixin.qq.com/")#创建或者打开一个数据库db = shelve.open("cookies")cookies = db["cookies"]for cookie in cookies:if "expiry" in  cookie.keys():cookie.pop("expiry")#把字典加入到driver的cookie中self.driver.add_cookie(cookie)self.driver.get("https://work.weixin.qq.com/wework_admin/frame")self.driver.find_element(By.ID, "menu_contacts").click()db.close()

运行结果如下:

web自动化你需要知道的相关推荐

  1. 达内html5是什么,Web前端工程师应该知道的HTML5相关知识有哪些

    今天小编要跟大家分享的文章是关于Web前端工程师应该知道的HTML5相关知识有哪些?随着互联网技术的快速发展,人们对互联网的使用越来越大,对于界面和用户体验的要求越来越高.因此Web前端越来越火,前端 ...

  2. 每个Web开发人员应该知道的12个终端命令

    Tips 原文作者:Danny Markov 原文地址:12 Terminal Commands Every Web Developer Should Know About 终端是开发人员的武器库中最 ...

  3. Web开发人员应当知道的15个开源项目

    如今,构建网站和开发Web应用程序已经不仅要求开发人员是一名优秀的程序员,更需要聪明的程序员.这也就是说,在可能的情况下,重复使用已有的代码和应用程序,而不是自己重头开始. 开源由来已久,并且很多网站 ...

  4. 一张图带你看懂 ,web前端开发应该知道的HTML5六大趋势

    目前最具人气的前端开发技术框架是什么?移动至上时代的来临促使越来越多的开发者利用HTML5开发移动友好型网站.HTML5的主要优势一直在不断演进,旨在提供足以与原生技术相匹配的功能. 从雷军这样的互联 ...

  5. 关于Mobile Web App你所应该知道的

    Native App与Web App的争论从未停息过,尽管很多人在批判Web App的各种不是,但也阻止不了各种各样的Web App如雨后春笋般出现,尤其是伴随智能手机的普及而受到重视的Mobile ...

  6. 每个Web开发者都应该知道的SOLID原则

    原创: 前端之巅 前端之巅 10月20日 作者|Chidume Nnamdi 编辑|谢丽 面向对象的编程并不能防止难以理解或不可维护的程序.因此,Robert C. Martin 制定了五项指导原则, ...

  7. [面试专题]前端需要知道的web安全知识

    前端需要知道的web安全知识 标签(空格分隔): 未分类 安全 [Doc] Crypto (加密) [Doc] TLS/SSL [Doc] HTTPS [Point] XSS [Point] CSRF ...

  8. 作为软件工程师你应该知道的100件事(下)

    上一篇 : 作为软件工程师你应该知道的100件事(上) 学习 (47) 作为一名程序员,你应该从根本上享受学习和探索.如果你不喜欢它们,你应该认真考虑其他职业选择. (48) 你不需要学习进入市场的每 ...

  9. 你应该知道的25个非常有用的CSS技巧

    在我们的前端CSS编码当中,经常要设置特殊的字体效果,边框圆角等等,还要考虑兼容性的问题, CSS网页布局,说难,其实很简单.说它容易,往往有很多问题困扰着新手,在中介绍了非常多的技巧,这些小技巧与知 ...

  10. C#开发人员应该知道的13件事情

    C#开发人员应该知道的13件事情 本文讲述了C#开发人员应该了解到的13件事情,希望对C#开发人员有所帮助. 1. 开发过程 开发过程是错误和缺陷开始的地方.使用工具可以帮助你在发布之后,解决掉一些问 ...

最新文章

  1. 实现一个全链路监控平台很难吗?一点都不难。。。
  2. Android Studio cannot find declaration to go to
  3. IntelliJ IDEA 2020.1 EAP2 发布:新增禅模式和 LightEdit 模式
  4. PL/SQL 编程(二)
  5. antd vue关闭模态对话框_如何在Bootstrap项目中用Vue.js替代jQuery
  6. sql查看数据库线程数_SQL Server始终在可用性组数据库上的最大辅助线程
  7. vector容器——构造函数
  8. Java中的关键字有哪些?「Java中53个关键字的意义及使用方法」
  9. 5.1声道测试文件下载
  10. 计算机开机密码输入不了,win10开机密码输入不了,win10开机密码输入没反应
  11. java面试宝典及答案_最新Java面试宝典及答案
  12. asp毕业设计——基于asp+access的网上投票系统设计与实现(毕业论文+程序源码)——网上投票系统
  13. 【路径规划】样条曲线
  14. Uniapp 应用开机自启插件 Ba-Autoboot
  15. php apc.dll,php_apc.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家
  16. 首次沙龙场面火爆,高能分享掌声不断,大咖观点集锦为你总结好了
  17. Win8.1打开电脑时提示C:\WINDOWS\system32\config\systemprofile\Desktop不可用的解决方法
  18. Android自定义schema,android hybird 实现:自定义schema
  19. 编译原理 第十章 代码优化
  20. android百度播放器,终结媒体播放器 百度推新Android浏览器

热门文章

  1. 在OEL6.5平台安装Oracle11g 数据库
  2. 客户端到服务器端的通信过程及 原理图很好
  3. 第一方数据,第二方数据,第三方数据:你了解多少?
  4. 计算机检索自考,计算机信息检索02139自考资料(25页)-原创力文档
  5. Arduino实训-可移动机械臂(智能小车)
  6. 田忌赛马 - 动态规划
  7. HTML Table导出EXCEL(支持大量数据,保留报表格式)
  8. 论文笔记—RGB-D SLAM in Dynamic Environments Using Static Point Weighting
  9. 阿里云对象存储OSS中上传的资源在生成URL链接时直接在浏览器中打开而不是下载的问题解决方法
  10. 如何将多个mp3文件合并成一个?