webUI自动化之元素及浏览器操作

news2024/11/15 21:36:50

一、元素定位方式

  1、元素属性定位:

 1 element = driver.find_element_by_id(self, 'id')   

    该类方法已经过时,新的方法如下:

element = driver.find_element(By.ID, 'ID 值')        # 用元素的 ID 属性定位

element = driver.find_element(By.CLASS_NAME, 'classname 值')    # 用元素的 CLASS_NAME 属性定位

element = driver.find_element(By.NAME, 'name 值')       # 用元素的 NAME 属性定位

element = driver.find_element(By.LINK_TEXT, '元素文本值')    # 用元素的 LINK_TEXT(链接文本) 定位

element = driver.find_element(By.PARTIAL_LINK_TEXT, '元素文本部分值')  # 用元素的 LINK_TEXT(链接文本,部分匹配) 定位

element = driver.find_element(By.TAG_NAME, '元素标签名')    # 用元素的 TAG_NAME(标签名) 定位

element = driver.find_element(By.CSS_SELECTOR, '元素 css_selector 值')  # 用元素的 CSS选择器 定位,这个可以先去了解一下CSS选择的用法,也可以不用,F12可直接复制当前元素的 css属性 值

element = driver.find_element(By.XPATH, '元素 xpath 路径')      # 用元素的 XPATH路径 定位,这个也可以去了解一下XPATH的语法,也可以不用,F12可直接复制当前元素的 xpath 路径

    class By如下:

二、鼠标及键盘事件

  1、鼠标事件

    模拟鼠标操作,需先引入 ActionChains 类,具体用法如下:

 1 from time import sleep
 2 from selenium import webdriver
 3 from selenium.webdriver.common.by import By
 4 from selenium.webdriver.common.action_chains import ActionChains  # 引入
 5 
 6 driver = webdriver.Chrome()
 7 driver.get(r'https://xxx')  # 打开浏览器并访问该链接,这里的链接不便展示哈
 8 driver.maximize_window()
 9 
10 # 定位元素并操作
11 driver.find_element(By.NAME, 'username').send_keys('v-luoyang')
12 driver.find_element(By.NAME, 'password').send_keys('12456')
13 btn = driver.find_element(By.CLASS_NAME, 'el-button')
14 
15 ActionChains(driver).click(btn).perform()   # 单击 btn 元素,更多方法参见 ActionChains 的源码,说的非常清楚
16 
17 
18 # 关闭并退出浏览器
19 driver.quit()

   2、键盘事件

    模拟键盘操作,需先引入 Keys 模块,再使用 send_keys 方法,具体使用如下:

 1 from time import sleep
 2 from selenium import webdriver
 3 from selenium.webdriver.common.by import By
 4 from selenium.webdriver.common.keys import Keys
 5 
 6 driver = webdriver.Chrome()
 7 driver.get(r'https://xxx/')  # 打开浏览器并访问该链接,这里的链接不便展示哈
 8 driver.maximize_window()
 9 
10 # 定位元素
11 user_ele = driver.find_element(By.NAME, 'username')
12 pwd_ele = driver.find_element(By.NAME, 'password')
13 
14 user_ele.send_keys('v-luoyang')     # 输入值
15 user_ele.send_keys(Keys.CONTROL, 'a')     # 全选
16 user_ele.send_keys(Keys.DELETE)     # 删除
17 user_ele.send_keys(Keys.ENTER)     # 回车
18 
19 btn = driver.find_element(By.CLASS_NAME, 'el-button')
20 btn.click()
21 
22 
23 # 关闭并退出浏览器
24 #driver.quit()

  更多的支持的键盘符号可在 Keys 类里查看

三、浏览器操作

  

 1 from selenium import webdriver
 2 
 3 driver = webdriver.Chrome()     # 获取浏览器对象
 4 driver.get(r'https://gad.dev.ztgame.com/')  # 打开浏览器并访问该链接,这里的链接不便展示哈
 5 driver.get(r'https://gad.dev.ztgame.com/#/creative/material')   # 进入其他链接
 6 driver.maximize_window()    # 浏览器窗口最大化
 7 driver.set_window_size(width=480, height=800)   # 设置浏览器的宽高
 8 name = driver.name  # 获得浏览器名称
 9 driver.forward()    # 前进
10 driver.back()   # 后退
11 driver.refresh()    # 刷新
12 current_handle = driver.current_window_handle   # 获取当前窗口句柄,即获取当前浏览器当前窗口的编号
13 all_handles = driver.window_handles     # 获取当前浏览器所有窗口的句柄(当前浏览器指通过上面 get() 方法打开的浏览器)
14 driver.switch_to_window('句柄')   # 切换当前窗口为指定的句柄的窗口
15 current_url = driver.current_url    # 获取当前窗口的url
16 title = driver.title    # 获取当前窗口的标题
17 page = driver.page_source   # 获取当前窗口的源码
18 driver.get_screenshot_as_file('截图保存路径')     # 窗口截图,保存至指定的路径
19 
20 driver.close()      # 关闭当前窗口
21 driver.quit()       # 关闭所有窗口并退出浏览器

四、等待

  1、sleep()

      例:

        sleep(3),强制等待,无论程序是否加载完成,必须等待3s,常用于调试,在元素定位莫名定位不到的时候用它也许可以解决问题

  2、隐式等待

      例:

        driver.implicitly_wait(30)   # 隐性等待,最长等30秒

        相当于设置了一个最长等待时间,若在规定时间内找到则执行下一步,未找到则抛出NoSuchElementException;它的作用域是全局的,跟driver的生命周期相同,一般定义在父类中,用于给所有子类的页面元素设置该等待机制,设置一次,全局有效,直到 driver 实例被关闭。

      PS:可以和显式等待一起使用,但建议不要一同使用。一同使用时,取决于谁设置的时间更长。

  3、显式等待

      显式等待一般搭配 until() 方法使用,意为直到规定时间内定位到该元素,例:

        

1

WebDriverWait(driver, 200.5).until(EC.presence_of_element_located(locator))    #  locator 如 locator = (By.ID, 'username')

      PS:这里用到了 WebDriverWait 类与 expected_conditions 模块,这里借用一下另一个博客的(他的博客地址)

         ①WebDriverWait 类里主要有两个方法和一个 init 方法,具体用处可以看源码,但官方话看得我是头昏脑胀,还是看一些比较容易懂的

        __init__,参数如下: 

1     driver: 传入WebDriver实例,即我们上例中的driver
2     timeout: 超时时间,等待的最长时间(同时要考虑隐性等待时间)
3     poll_frequency: 调用until或until_not中的方法的间隔时间,默认是0.5秒
4     ignored_exceptions: 忽略的异常,如果在调用until或until_not的过程中抛出这个元组中的异常,则不中断代码,继续等待,如果抛出的是这个元组外的异常,则中断代码,抛出异常。默认只有NoSuchElementException。

        until,参数如下:

1 method: 在等待期间,每隔一段时间(__init__中的poll_frequency)调用这个传入的方法,直到返回值不是False

2 message: 如果超时,抛出TimeoutException,将message传入异常 

        

        until_not 与 until 相反。

        调用方法:

 1 WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息) ,这里的可执行方法指该方法中一定要有__call()__方法,没有就会报错 TypeError: 'xxx' object is not callable

        ② expected_conditions 是 selenium 中的一个模块(selenium.webdriver.support.expected_conditions),主要包含了一系列的判断条件。

      

        以下两个条件类验证title,验证传入的参数title是否等于或包含于driver.title
          title_is
          title_contains

        以下两个条件验证元素是否出现,传入的参数都是元组类型的locator,如(By.ID, ‘kw’)
        顾名思义,一个只要一个符合条件的元素加载出来就通过;另一个必须所有符合条件的元素都加载出来才行
          presence_of_element_located
          presence_of_all_elements_located

        以下三个条件验证元素是否可见,前两个传入参数是元组类型的locator,第三个传入WebElement
        第一个和第三个其实质是一样的
          visibility_of_element_located
          invisibility_of_element_located
          visibility_of

        以下两个条件判断某段文本是否出现在某元素中,一个判断元素的text,一个判断元素的value
          text_to_be_present_in_element
          text_to_be_present_in_element_value

        以下条件判断frame是否可切入,可传入locator元组或者直接传入定位方式:id、name、index或WebElement
          frame_to_be_available_and_switch_to_it

        以下条件判断是否有alert出现
          alert_is_present

        以下条件判断元素是否可点击,传入locator
          element_to_be_clickable

        以下四个条件判断元素是否被选中,第一个条件传入WebElement对象,第二个传入locator元组
        第三个传入WebElement对象以及状态,相等返回True,否则返回False
        第四个传入locator以及状态,相等返回True,否则返回False
          element_to_be_selected
          element_located_to_be_selected
          element_selection_state_to_be
          element_located_selection_state_to_be

        最后一个条件判断一个元素是否仍在DOM中,传入WebElement对象,可以判断页面是否刷新了
          staleness_of

​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1502876.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云打印软件免费版在哪?云打印服务怎么使用?

随着新的一年的到来,很多同学们又开始准备着新一轮的学习冲刺了。在学习的旅途中,打印资料的需求必然伴随着每一个人,但是线下打印店价格贵、打印不方便、没时间去打印等多种因素总是制约着我们。在这种情况下,云打印软件和云打印…

Svg Flow Editor 原生svg流程图编辑器(一)

系列文章 Svg Flow Editor 原生svg流程图编辑器(二) 效果展示 项目概述 svg flow editor 是一款流程图编辑器,提供了一系列流程图交互、编辑所必需的功能,支持前端研发自定义开发各种逻辑编排场景,如流程图、ER 图、…

【论文笔记】Scalable Diffusion Models with State Space Backbone

原文链接:https://arxiv.org/abs/2402.05608 1. 引言 主干网络是扩散模型发展的关键方面,其中基于CNN的U-Net(下采样-跳跃连接-上采样)和基于Transformer的结构(使用自注意力替换采样块)是代表性的例子。…

使用R语言进行聚类分析

一、样本数据描述 城镇居民人均消费支出水平包括食品、衣着、居住、生活用品及服务、通信、文教娱乐、医疗保健和其他用品及服务支出这八项指标来描述。表中列出了2016年我国分地区的城镇居民的人均消费支出的原始数据,数据来源于2017年的《中国统计年鉴》&#xf…

传递函数硬件化

已知一个系统的传递函数,如何进行硬件化呢? 只需要将传递函数离散化,得到差分方程,就可以根据差分方程进行硬件设计。 通过例子说明: 得到差分方程后,其中y(k)/y(k-1)/y(k-2)/u(k-1)/u(k-2)等代表不同周期…

【Spring】Spring状态机

1.什么是状态机 (1). 什么是状态 先来解释什么是“状态”( State )。现实事物是有不同状态的,例如一个自动门,就有 open 和 closed 两种状态。我们通常所说的状态机是有限状态机,也就是被描述的事物的状态的数量是有…

BC161 大吉大利,今晚吃鸡

一&#xff1a;题目 二&#xff1a;思路 三&#xff1a;代码 #include<bits/stdc.h>using namespace std;long long cnt;//柱子定义为x, y, z void move(int n, char x, char y, char z) {if(n 1){//printf("%c -> %c\n", x, y);//最大盘从x->y//prin…

git远程仓库分支推送与常见问题

1.查看远程仓库分支情况 git fetch origin git branch -r2.删除远程仓库中的某一分支(如master) git push origin --delete master问: 如果我的本地文件只有一个分支main,而远程仓库有两个分支Main和CubeMX, 若要将本地文件中新增的文件Test1.txt更改放入CubeMX中&#xff0c…

大数据开发-Hadoop分布式集群搭建

大数据开发-Hadoop分布式集群搭建 文章目录 大数据开发-Hadoop分布式集群搭建环境准备Hadoop配置启动Hadoop集群Hadoop客户端节点Hadoop客户端节点 环境准备 JDK1.8Hadoop3.X三台服务器 主节点需要启动namenode、secondary namenode、resource manager三个进程 从节点需要启动…

Linux操作系统项目上传Github代码仓库指南

文章目录 1 创建SSH key2.本地git的用户名和邮箱设置3.测试连接4.创建仓库5.终端项目上传 1 创建SSH key 1.登录github官网,点击个人头像,点击Settings,然后点击SSH and GPG keys,再点击New SSH key。 Title 可以随便取&#xff0c;但是 key 需要通过终端生成。 Linux终端执行…

窄带波束形成

阵列信号处理有以下三个研究方向&#xff1a; 检测入射信号是否存在&#xff0c;以及入射信号的数目检测入射信号的到达方向&#xff08;DOA)角增强某个感兴趣方向的信号&#xff0c;抑制其他方向的干扰&#xff08;beamforming) 波束形成&#xff08;beamforming&#xff09;…

福州·名城银河湾220㎡现代简约风装修案例分享。福州中宅装饰,福州装修

以手作维度构境, 跳脱约定成俗的风格, 转化内外地域分际, 于静谧中凝聚丰厚的美学能量, 谦虚且沉默以对。 平面设计图 项目信息 项目名称 | 名城银河湾 设计地址 | 福建福州 项目面积 | 220㎡ 项目户型 | 5室2厅2厨3卫 设计风格 | 现代轻奢 首席设计师丨欧阳光玉 中…

STM32 | STM32F407ZE(LED寄存器开发续第二天源码)

上节回顾 STM32 | STM32时钟分析、GPIO分析、寄存器地址查找、LED灯开发(第二天)STM32 | Proteus 8.6安装步骤(图文并茂)一、 LED灯开发 1、理解led灯原理图 LED0连接在PF9 PF9输出低电平(0),灯亮;PF9输出高电平(1),灯灭;(低电平有效) 2、打开GPIOF组时钟 //将…

随机输一次(Python3)

大家应该都会玩“锤子剪刀布”的游戏&#xff1a;两人同时给出手势&#xff0c;胜负规则如图所示&#xff1a; 现要求你编写一个控制赢面的程序&#xff0c;根据对方的出招&#xff0c;给出对应的赢招。但是&#xff01;为了不让对方意识到你在控制结果&#xff0c;你需要隔 K …

网络安全相关证书有哪些?

从事于信息安全工作的人们&#xff0c;在面对繁杂问题的时候&#xff0c;往往会有焦虑和烦躁的表现。一部分可能来自于系统和流程的实际漏洞&#xff0c;一方面可能是自身的能力还有部分短板。许多人认为庞杂的问题或多或少的难以下手&#xff0c;如果有好的方式能够同时解决这…

Linux报错排查-刚安装好的ubuntu系统无法ssh连接

Linux运维工具-ywtool 目录 一.问题描述二.问题解决2.1 先给ubuntu系统配置阿里云源2.2 安装openssh-server软件2.3 在尝试ssh连接,可以连接成功了 三.其他命令 一.问题描述 系统:ubuntu-18.04-desktop-amd64 系统安装完后,想要通过xshell软件连接系统,发现能Ping通系统的IP,但…

计算布尔二叉树的值

题目 题目链接 . - 力扣&#xff08;LeetCode&#xff09; 题目描述 代码实现 class Solution { public:bool evaluateTree(TreeNode* root) {if(root->left nullptr && root->right nullptr) return root->val;bool left evaluateTree(root->left)…

CubeMX使用教程(6)——ADC模拟输出

本篇将利用CubeMX开发工具学习ADC&#xff08;模拟输出&#xff09;的使用 我们还是利用上一章的工程进行二次开发&#xff0c;这样方便 首先打开CubeMX进行相关配置 通过查看G431RBT6开发板有关模拟输出部分的原理图可知&#xff0c;模拟输出用到的IO口是PB15和PB12 接着我…

11、Linux-安装和配置Redis

目录 第一步&#xff0c;传输文件和解压 第二步&#xff0c;安装gcc编译器 第三步&#xff0c;编译Redis 第四步&#xff0c;安装Redis服务 第五步&#xff0c;配置Redis ①开启后台启动 ②关闭保护模式&#xff08;关闭之后才可以远程连接Redis&#xff09; ③设置远程…

接口自动化测试框架搭建:基于python+requests+pytest+allure实现

众所周知&#xff0c;目前市面上大部分的企业实施接口自动化最常用的有两种方式&#xff1a; 1、基于代码类的接口自动化&#xff0c;如&#xff1a; PythonRequestsPytestAllure报告定制 2、基于工具类的接口自动化&#xff0c;如&#xff1a; PostmanNewmanJenkinsGit/svnJme…