selenium + python自动化测试unittest框架学习(三)webdriver元素定位(一)

1.Webdriver原理

webdirver是一款web自动化操作工具,为浏览器提供统一的webdriver接口,由client也就是我们的测试脚本提交请求,remote server浏览器进行响应请求,相对于原来selenium1中的selenium rc更加的简便,对浏览器的操作更加灵活。

2.定位

(1)元素的定位:

元素的定位可以通过id,name,class name,tag name,link_text,partial_link_text,css selector,xpath等

语法格式为:find_element_by_xxxx()

例如百度的搜索框

如果想要定位百度搜索框则可以

find_element_by_id("kw") or find_element_by_class_name("s_pt") or find_element_by_name("wd") or find_element_by_tag_name("input")

或者通过xpath定位:可以使用FirePath工具定位:

xpath:find_element_by_xpth(".//*[@id=‘kw‘]")

如果是一个文本链接可以通过link_name("文本")或者文本信息较长的可以通过部分文本信息来定位partial_link_text("部分文本")

以上的所有定位准确前提是必须保证定位元素括号中填写的信息的唯一性,才可以准确定位到元素上,例如定位class_name,必须确定仅有该元素应用到该calss name,否则请更换其他的定位方式。

有关元素的定位一般还是建议有id的,有name的,用这两者定位更加准确,xpath也是一个重要的定位方式。

*.xpath定位

虽然说xpath定位可以借用类似FirePath这样的工具来获取,但是我们还是必须清楚xpath定位的语法,以便后期我们在修改代码的时候能够清楚元素到底定位的是哪个。

xpath的路径表达式:

路径表达式 结果
bookstore 选取 bookstore 元素的所有子节点。
/bookstore
选取根元素 bookstore。

注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!

bookstore/book 选取属于 bookstore 的子元素的所有 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取名为 lang 的所有属性。

带谓语的表达式,谓语用中括号括描述,选取所有可以用*

路径表达式 结果
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang=‘eng‘] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

(2)定位一组对象

定位单个元素是find_element,那么定位一组对象则是find_elements

定位一组对象的情况是对需要对一组对象进行批量操作或者是需要选取多个条件一样或类似的元素,其是先选取一组对象后再根据筛选条件进行遍历过滤最终定位所需的符合条件的元素。

例如:勾选所有的checbox元素或者是对一组元素做同样的操作的时候

checbox =  find_elements_by_xx()          #首先定位一组元素
for i in checkbox:                       #遍历勾选所有checkbox
    i.click()

(3)层级定位

很多元素都没有规范的id或者name来定位,而且元素的class name和tag name都是一样的,且又是第几层的元素,很难定位,所以定位该元素的方法是,先定位父级元素,然后再定位子级元素

例如:菜单list中子级菜单标签的定位

如果要定位新闻标签,我们可以通过先定位ul元素,再定位a元素,这样定位比较准确

parent = find_element_by_id("ul")
children = parent.find_element_by_name("tj_tnews")
chidren.click()

(4)定位Frame中的对象

有些页面的框架嵌套着另一个框架,如果需要定位被嵌套的框架里的内容则可以先定位到外部框架,再定位到被嵌套的框架,然后就可以定位里面的页面元素,其实这个思路和定位层级元素是一样的,只是这里用到定位框架的语句需要记下

switch_to_frame(id)

例如:框架A嵌套这框架B,现在需要定位框架B中的文本框

switch_to_frame(id = a)
switch_to_frame(id = b)
find_element_by_id("textboxid")

定位弹出的框架后操作完成需要跳出框架才可以定位原先页面上的元素。

driver.switch_to_frame("layui-layer-iframe1")           #定位框架
.....
driver.switch_to_default_content()                      跳出框架
driver.find_element_by_xpath("html/body")
时间: 2024-10-14 06:43:52

selenium + python自动化测试unittest框架学习(三)webdriver元素定位(一)的相关文章

selenium + python自动化测试unittest框架学习(二)

1.unittest单元测试框架文件结构 unittest是python单元测试框架之一,unittest测试框架的主要文件结构: File >report >all_case.py >test_case >__init__.py >test_case1..... >public >__init__.py >login.py >loginout.py test_case文件夹主要存放测试用例,且测试用例命名以test_开头 public文件夹是test

selenium + python自动化测试unittest框架学习(五)webdriver的二次封装

因为webdriver的api方法很长,再加上大多数的定位方式是以xpath方式定位,更加让代码看起来超级长,为了使整体的代码看起来整洁,对webdriver进行封装,学习资料来源于虫师的<selenium +  python自动化测试>一书. 在与测试用例文件夹同一目录下新建一个文件夹package,用来放置封装方法的模块文件 我们将webdriver二次封装的文件命名为location.py from selenium import webdriver from test_case.pub

selenium + python自动化测试unittest框架学习(一)selenium原理及应用

unittest框架的学习得益于虫师的<selenium+python自动化实践>这一书,该书讲得很详细,大家可以去看下,我也只学到一点点用于工作中,闲暇时记录下自己所学才能更加印象深刻.unittest框架学习需要掌握以下知识点: (1)Selenium原理及工具使用 (2)webdriver元素定位,id,name,class name,css seletor,xpath (3)python语言基础,模块,参数化,语言,装饰器 (4)unittest框架认识及学习:模块化,断言,参数化,数

selenium + python自动化测试unittest框架学习(三)webdriver对页面其他控件操作(三)

1.对话框,下拉框 (1)对话框的有两种,一种是iframe格式的,需要switch_to_iframe()进行定位,现在大部分的对话框是div格式的,这种格式的可以通过层级定位来定位元素,先定位对话框的div,然后再对对话框的元素进行定位. (2)另外的弹出消息提示框有三种类型:alert,comfirm,prompt,三种类型的区别为; alert消息提示框仅提供"确定"按钮,用于警告等提示,comfirm提示框提供"是"和"否"的选择,pr

selenium + python自动化测试unittest框架学习(三)webdriver元素操作(二)

上一篇是元素的定位,那么定位元素的目的就是对元素进行操作,例如写入文本,点击按钮,拖动等等的操作 (1)简单元素操作 简单元素操作 find_element_by_id("kw").clear() #文本框清空 find_element_by_id("kw").send_keys("selenium") #文本框输入 find_element_by_id("button").click() #点击按钮操作 (2)webElem

selenium + python自动化测试unittest框架学习(七)随机生成姓名

在自动化测试过程中经常要测试到添加用户的操作,每次都要输入中文,原本是找了十几个中文写成了列表,然后从列表中随机取出填入用户名文本框中,随着测试的增加,发现同名的人搜索出来一大堆,最后在网上找了个随机生成姓名的方法,在此记录下,学习来源:https://segmentfault.com/q/1010000006941249 姓氏和名字的列表: import random import string last_names = ['赵', '钱', '孙', '李', '周', '吴', '郑',

selenium + python自动化测试unittest框架学习(四)python导入模块及包知识点

在写脚本的时候,发现导入某些模块,经常报错提示导入模块失败,这里来恶补下python导入模块的知识点. 1.模块导入时文件查找顺序 在脚本中,import xxx模块时的具体步骤: (1)新建一个module (2)将module插入到sys.module (3)查找module的路径,查找的顺序为先查找当前使用导入模块的文件同一级目录,之后是python的搜索模块的路径集sys.path,最后是python所添加的默认环境变量的路径Python path (4)module查找到之后装载mod

selenium + python自动化测试unittest框架学习(六)分页

接触的项目分页的形式是以下形式: 想要获取总页数后,遍历执行翻页的功能,但由于分页是以javascript方法实现的,每次点击确定按钮后,页面就回刷新,webelement元素过期无法遍历下一个进行翻页操作,报StaleElementReferenceException的错误,所以对于这个操作折腾了半天还是放弃了. 对于分页的操作实现了以下功能: (1)获取总页数并输出 (2)遍历操作'上一页','下一页'按钮,实现翻页功能 (3)在输入页数的文本框中输入页数,点击确定,实现翻页功能 def p

selenium+python自动化测试--数据驱动

之前selenium+python自动化测试--登录  中,几个账号和密码登录就要写几个用例,感觉很麻烦~,所以下面介绍一下用数据驱动实现不同用例的登录. 话不多说,直接贴代码~~ 文件名称:test_ddtlogin.py import ddt import unittest from selenium import webdriver from common.base import Base testdata = [ {'user':'','psw':'','exp':'请输入手机号码'},