首页 > 其他分享 >【UI自动化基础】元素定位

【UI自动化基础】元素定位

时间:2024-01-30 12:33:06浏览次数:30  
标签:定位 标签 元素 driver switch UI 自动化 属性

元素定位

元素定位的定义

  • 元素定位是指查找元素HTML代码的过程
  • 元素HTML代码指的是从开始标签到结束标签之间的所有代码
  • find_element定位一个元素
  • find_elements定位多个元素

元素定位方法

  • by_id 当元素具有id属性时,可以通过by_id定位元素
    方法:driver.find_element_by_id('id属性值')
    说明:HTML规定整个HTML文档中元素的id属性值必须是唯一的不允许重复。

  • by_name 当元素具有name时,可以通过by_name定位元素。
    方法:driver.find_element_by_name('name属性值')
    说明:HTML规定name属性指定元素名称,name属性值允许重复,可以不唯一。

  • by_class_name 当元素具有class属性时,可以通过by_class_name定位元素。
    方法:driver.find_element_by_class_name('class属性值')
    说明:HTML规定class属性指定元素类名,class属性允许有多个值,多个值之间使用空格分隔。元素定位时任选其一即可。class属性值允许重复。

  • by_tag_name 通过元素标签名定位元素,由于查找到的标签名通常不止一个,所以一般结合find_elements使用。

    • 单数定位
      方法:driver.find_element_by_tag_name(‘标签名’)
      说明:返回符合条件的第一个元素,结果为元素对象。

    • 复数定位
      方法:driver.find_elements_by_tag_name(‘标签名’)
      说明:返回符合条件的所有元素,结果为列表,列表中为符合条件的所有元素对象。

  • by_link_text 通过超链接元素的全部文字定位元素
    方法:driver.find_element_by_link_text(‘超链接全部文字’)

  • by_partial_link_text 通过超链接元素的部分文字定位元素
    方法:driver.find_element_by_partial_link_text(‘超链接部分文字’)

  • by_xpath
    xpath(XML path)用来确定XML文档中某部分位置的语言
    方法:driver.find_element_by_xpath(‘xpath表达式’)
    xpath表达式:

  • 绝对路径 从根元素到指定元素之间经过的所有元素的层级路径,以/开头

  • 相对路径 从符合条件的元素开始,以//开头

  • 标签+属性
    //标签名[@属性名=”属性值”]

  • 层级定位
    //父元素标签名[@父元素属性名=”父元素属性值”]/子元素标签名

  • 索引定位
    //父元素标签名[@父元素属性名=”父元素属性值”]/子元素标签名[索引] xpath表达式索引从1开始

  • by_css_selector
    css(层叠样式表)是用来表现xml或html等文档样式的语言
    方法:driver.find_element_by_css_selector(‘css表达式’)
    css表达式:

  • id属性定位 # id属性值

  • class属性定位 .class属性值

  • 标签+属性 标签名[属性名=”属性值”]

  • 层级定位 父元素的标签名[父元素属性名=”父元素属性值”] >子元素标签名

  • 索引定位

  • 匹配父元素中的第n个子元素
    父元素的标签名[父元素属性名=”父元素属性值”] >子元素标签名:nth- child(n)

  • 匹配父元素同种标签第n个子元素
    父元素的标签名[父元素属性名=”父元素属性值”] >子元素标签名:nth-of-type(n)

xpath、css定位更多用法:

【【自动化测试】xpath、css使用及区别】

元素定位策略

  • 当页面元素具有id属性时,可以通过by_id定位元素;
  • 当页面元素有超链接需要定位时,通过link_text或partial_link_text定位元素;
  • 当常用方法都无法定位元素时,可以考虑使用xpath或css定位。
  • xpath定位功能很强大,但采用从上到下遍历搜索模式,定位速度慢,尽量少用。
  • css语法简单,采用样式定位,定位速度较快,同时对浏览器的兼容性较好。

元素操作

常用操作

  • 输入
    元素对象.send.keys(‘输入内容’)
  • 点击
    元素对象.click()
  • 其他操作
  • 清空
    元素对象.clear()
  • 获取元素文字
    元素对象.text
  • 获取元素属性值
    元素对象.get_attribute(‘属性值’)
  • 判断元素是否被选中,如果被选择返回True,否则返回False
    元素对象.is_selected()

下拉菜单

普通方法定位

直接定位下拉菜单中的选项,并点击

Select类方法定位

  1. 定位<select>标签实现的下拉菜单元素
    webelement = driver.find_element_by_XXX(' ') 提供的八种方法随便选择
    2.使用Select类中提供的方法选择菜单选项
  • 通过select类提供的方法,选择下拉菜单中的具体选项。
    Select(webelement).select_by_index(索引)
  • 通过value属性值选择菜单选项。
    Select(webelement).select_by_value('value属性值')
  • 通过文字选择菜单选项。
    Select(webelement).select_by_visible_text(文字)

说明:Select类只针对于<select>标签实现的下拉菜单有效

单选框和复选框

单选框

定位并点击

复选框

复选框的单选

  • 定位并点击
    复选框的全选
  • 使用find_elements复数定位,对结果进行遍历点击,但需要注意的是,再次点击已选择的复选框相当于取消,所以点击之前先要判断复选框是否已被选择

多窗口

在页面操作过程中,点击超链接有时会打开一个新窗口,如果要定位新窗口中的元素需要使用switch_to.window()切换窗口。

  1. 获取所有窗口句柄(窗口id) driver.window_handles
  2. 获取当前窗口句柄 driver.current_window_handle
  3. 切换窗口 driver.switch_to.window(driver.window_handles[索引])
    def base_switch_handle(self):
        """窗口句柄切换"""
        handle = self.driver.current_window_handle   # 当前窗体句柄
        print("当前窗体句柄:", handle)
        handles = self.driver.window_handles    # 所有窗体句柄
        print("窗体句柄", handles)       # 获取浏览器所有窗体的句柄
        self.driver.switch_to.window(handles[-1])   # 切换至最新窗口句柄

鼠标事件

ActionChains类鼠标操作方法

  • 鼠标拖拽
    ActionChains(drive).drag_and_drop(起始元素,目标元素).perform()

  • 鼠标悬停
    ActionChains(drive).move_to_element(目标元素).perform()

调用ActionChains类中的鼠标操作方法时,事件不会立即执行,而是会将事件保存到一个队列中,需要调用perform()方法,队列中的事件才会执行

滚动条

当页面元素超过一屏时,有时候可能无法定位屏幕下方的元素,这时就需要拖动滚动条,使被定位的元素出现在当前屏幕上,而selenium无法定位和操作滚动条,需要借助js脚本。

  1. js脚本实现浏览器中打开新窗口 window.open(“网址”)
  2. js脚本实现拖动滚动条 window.scrollBy(水平距离,垂直距离)
  3. selenium执行js脚本 driver.execute_script('js脚本')

表单嵌套页面

在web应用程序中会经常遇见iframe/frame表单嵌套页面,selenium无法定位嵌套页面中的元素,需要使用switch_to.frame()切换到表单的内嵌页面

1.进入表单内嵌页面

driver.switch_to.frame('id属性值') # iframe/frame标签元素的id属性值
# driver.switch_to.frame('name属性值') # iframe/frame标签元素的name属性值
# driver.switch_to.frame(索引) # iframe/frame标签元素的索引
element = driver.find_element_by_css_selector('#if2') # 先定位元素
driver.switch_to.frame(element) # iframe/frame标签元素对象

2.返回最外层页面

driver.switch_to.default_content()

3. 返回上一层页面

driver.switch_to.parent_frame()

js弹窗

JavaScript中有警告框、确认框、提示框三种弹窗。

selenium使用 switch_to.alert 定位js弹窗,然后调用相应的方法对js弹窗进行操作。

  • 点击js弹窗上的确定按钮 driver.switch_to.alert.accept()
  • 点击js弹窗上的取消按钮 driver.switch_to.alert.dismiss()
  • 获取js弹窗上的文字 driver.switch_to.alert.text
  • 向js弹窗输入内容 driver.switch_to.alert.send_keys("")

上传文件

对于标签名为input并且type属性值为file的上传功能,selenium通过send_keys(文件路径)来实现文件的上传。

验证码处理

web自动化登录验证码处理方法

  • 找开发改测试环境,将验证码的代码注释掉
  • 找开发设置万能码,只适用于输入型的验证
  • 使用cookie跳过登录
  • 验证码识别技术OCR

元素等待

在页面中定位元素时如果元素未出现,则在指定时间内一直等待的过程。
在web自动化中引入等待的机制,可以保证代码的稳定性,使代码不会受到网络、电脑等因素的影响。

Selenium中有三种等待方式:强制等待、隐式等待、显式等待

  • 强制等待:强行让浏览器等待指定时间,然后再进行下一步操作。
    方法:time.sleep(秒)

  • 隐式等待:在指定时间内,如果页面中的元素全部加载完成,则进行下一步操作,否则直到时间结束,然后抛出异常
    方法:driver.implicitly_wait(秒)

  • 显式等待:程序每隔一段时间就检查一次元素是否出现等条件,如果元素出现,则进行下一步操作,否则继续等待,直到超过最长等待时间,然后抛出超时异常。
    方法:WebDriverWait(driver,等待时间).until(EC.presence_of_element_located((By.ID, '属性值'))).send_keys('输入的东西')

标签:定位,标签,元素,driver,switch,UI,自动化,属性
From: https://www.cnblogs.com/upstudy/p/17995225

相关文章

  • burpsuite抓取修改http和https流量(proxy模块的简单应用)
    一、操作环境目标机:DVWA网站操作机:BurpSuite Prov2.1;FireFox浏览器二、操作步骤1.设置BP代理服务端口代理--选项--监听器(选项卡) 为什么不用8080?因为Tomcat默认端口和BP的默认监听端口一致,同时打开会导致端口冲突。2.设置Fir......
  • HT UI 5.0,前端组件图扑是认真的
    为顺应数字时代的不断发展,图扑HTUI5.0在原有功能强大的界面组件库的基础上进行了全面升级,融入了更先进的技术、创新的设计理念以及更加智能的功能。HTUI5.0使用户体验更为直观、个性化,并在性能、稳定性和安全性等方面达到新的高度。HTUI5.0的改版升级,是团队对于用户需......
  • 【APP自动化基础】安卓UI自动化
    环境搭建【自动化基础】搭建APP的UI自动化环境获取app的Activity和Package的五种方式方式一:通过dumpsyswindow获取#获取当前页面的Package和Activityadbshelldumpsyswindoww|findstr\/|findstrname=#或者:adbshelldumpsyswindow|findstrmCurrentFocusadb......
  • SOAP UI多并发访问配置
    1、在请求Request中,右键新建一个测试Case2、选择TestCase,新建负载测试3、运行 ......
  • 【APP自动化测试】APP元素定位工具
    appium做移动端自动化测试,定位元素工具uiautomatorviewerAppiumInspectorweditor前置条件:已连接真机或手机模拟器,adbdevices有显示连接的手机列表。uiautomatorvieweruiautomatorviewer是android-sdk自带的一个元素定位工具,目录D:\xxx\android-sdk-windows\tools。......
  • Walrus 实用教程|Walrus + Gitlab,打通CI/CD 自动化交付!
    Walrusfile是Walrus0.5版本推出的新功能,用户可以通过一个非常简洁的YAML描述应用或基础设施资源的部署配置,然后通过WalrusCLI执行walrusapply或在WalrusUI上进行import,将Walrusfile提交给Walrusserver,由Walrusserver完成对应用或基础设施资源的部署/配置/......
  • idea配置tomcat利用Build Artifacts打war包
    idea配置tomcat利用BuildArtifacts打war包idea有BuildArtifacts功能,可以一键打war包。这种方式适合没有maven等项目构建的。也就是老项目,把jar包放在lib里面的web项目。本人有幸参与改造公司的老项目。今天给大家分享如何打包!!!一.idea配置tomcat。我想大家都被分配到做这老项......
  • HT UI 5.0,前端组件图扑是认真的!
    为顺应数字时代的不断发展,图扑HTUI5.0在原有功能强大的界面组件库的基础上进行了全面升级,融入了更先进的技术、创新的设计理念以及更加智能的功能。HTUI5.0使用户体验更为直观、个性化,并在性能、稳定性和安全性等方面达到新的高度。HTUI5.0的改版升级,是团队对于用户需求......
  • 物流平台如何与电商平台进行自动化流程管理
    为什么要实现物流与电商平台进行自动化管理实现物流平台与电商平台的自动化流程管理对企业和消费者都有着重要的意义,比如以下几点:提高效率:自动化流程管理可以减少人为操作的错误和延误,提高订单处理和物流配送的效率。通过定义清晰的流程图和自动化工具,可以快速而准确地完成订单处理......
  • Jenkins + Gitlab 前后端项目自动化构建部署
    Jenkins+Gitlab前后端项目自动化构建部署:https://blog.csdn.net/IT_ZRS/article/details/115032509?spm=1001.2014.3001.5501Docker+Jenkins+Gitlab自动化构建部署:https://blog.csdn.net/IT_ZRS/article/details/117533847?spm=1001.2101.3001.6650.1&utm_medium=distrib......