使用WebElements定位多个相似的元素,比如页面中存在五个单选按钮,他们有相同的class属性,值为:myRadio,我们想对五个按钮循环操作,我们可以把它们全部取出来放到集合中,然后做循环操作
2017-07-25 10:49
651 查看
Selenium webdriver 学习总结-元素定位
webdriver提供了丰富的API,有多种定位策略:id,name,css选择器,xpath等,其中css选择器定位元素效率相比xpath要高些,使用id,name属性定位元素是最可靠,效率最高的一种办法。1、工具选择:在我们开发测试脚本的过程中各个浏览器给我们也提供了方便定位元素的工具,我比较喜欢使用firefox的firebug工具,也是目前很多开发测试人员比较热衷的选择,原因是firefox是唯一能够集成selenium IDE的浏览器,并且firebug给用户提供了丰富的扩展组件,我们可以根据自己的需要来选择,一般情况下,使用firebug+firefinder就足够使用了,firefinder支持xpath以及css选择器定位元素的功能,很方便帮助我们调试测试脚本
2、元素定位的方法:findElement() 与 findElements()
findElement() 该方法返回基于指定查询条件的webElement对象,或抛出不符合条件的异常 eg:driver.findElement(By.id("userID"));
findElements() 该方法返回指定查询条件的WebElement的对象集合,或返回null
3、WebElement对象提供的各种定位元素策略
ID:driver.findElement(By.id(<elementID>)) Name:driver.findElement(By.name(<elementName>)) className:driver.findElement(By.className(<elementClassName>)) tagName:driver.findElement(By.tagName(<htmlTagName>)) linkText:driver.findElement(By.linkText(<linkText>)) partialLinkText:driver.findElement(By.partialLinkText(<partialLinkText>)) css:driver.findElement(By.cssSelector(<cssSelector>)) xpath:driver.findElement(By.xpath(<xpathQuery>)) |
ID定位:driver.findElement(By.id("username"))
name定位:driver.findElement(By.name("username"))
class定位:driver.findElement(By.className("username"))
多学一招:WebElement类支持查询子类元素,如果页面中存在重复元素,但在不同div中,我们可以先定位到其父元素,然后定位其子元素,方法如下:
WebElement hello = driver.findElement(By.id("div1")).findElement(By.lindText("hello"));
5、使用WebElements定位多个相似的元素,比如页面中存在五个单选按钮,他们有相同的class属性,值为:myRadio,我们想对五个按钮循环操作,我们可以把它们全部取出来放到集合中,然后做循环操作,如下:
List<WebElement> radios = driver.findElements(By.className("myRadio")); for(int i = 0;i<radios.size();i++){ radios.get(i).click(); } |
一、WebDriver 的By类中提供了cssSelector()方法,该方法使用有以下几种形式:
1、使用相对路径定位元素
如,我们要定为DOM中的input元素,我们可以这样操作,不考虑其在DOM中的位置,但这样做存在一定弊端,当DOM中存在多个input元素时,该方法总返回DOM中的第一个元素,这并不是我们所期待的
eg:WebElement username = driver.findElement(By.cssSelector("input"));
另外,为了使用这种方法更准确的定位元素,我们可以结合该元素的其他属性来实现精确定位的目的
a、结合id来定位,driver.findElement(By.cssSelector("input#username")); 在标签与id之间使用#连接,如果对css了解的朋友一看就知道为什么会这样写了,不了解也没关系,只要记住这种写法就OK了
另外该方法也可简写为driver.findElement(By.cssSelector("#username")); 有点儿类似于id选择器
b、使用元素的任何属性来定位元素
driver.findElement(By.cssSelector("标签名[属性名='属性值']"));
c、匹配部分属性值
^= driver.findElement(By.cssSelector("标签名[属性名^='xxx']")); 匹配属性值以xxx开头的元素 $= driver.findElement(By.cssSelector("标签名[属性名$='xxx']")); 匹配属性值以xxx结尾的元素 *= driver.findElement(By.cssSelector("标签名[属性名^='xxx']")); 匹配属性值包含xxx的元素 |
driver.findElement(By.cssSelector("div#login>input")) 该方法中“div#login>input” 首先通过相对路径定位到id为login的div元素,然后查找其子元素input(绝对路径)
二、使用xpath定位元素,相比cssSelector,xpath是我比较常用的一种定位元素的方式,因为它很方便,缺点是,消耗系统性能
1、使用绝对路径定位元素
driver.findElement(By.xpath("/html/body/div/form/input"))
2、使用相对路径定位元素
driver.findElement(By.xpath("//input")) 返回查找到的第一个符合条件的元素
3、使用索引定位元素,索引的初始值为1,注意与数组等区分开
driver.findElement(By.xpath("//input[2]")) 返回查找到的第二个符合条件的元素
4、结合属性值来定位元素
driver.findElement(By.xpath("//input[@id='username']"));
driver.findElement(By.xpath("//img[@alt='flowr']"));
5、使用逻辑运算符,结合属性值定位元素,and与or
driver.findElement(By.xpath("//input[@id='username' and @name='userID']"));
6、使用属性名来定位元素
driver.findElement(By.xpath("//input[@button]"))
7、类似于cssSlector,使用部分属性值匹配元素
starts-with() driver.findElement(By.xpath("//input[stars-with(@id,'user')]")) ends-with driver.findElement(By.xpath("//input[ends-with(@id,'name')]")) contains() driver.findElement(By.xpath("//input[contains(@id,"ernam")]")) |
driver.findElement(By.xpath("//input[@*='username']"))
9、使用xpath轴来定位元素
这里略了,详见w3school.com
三、使用innerText定位元素
1、使用cssSelector查找innerText定位元素
driver.findElement(By.cssSelector("span[textContent='新闻']"));
2、使用xpath的text函数
driver.findElement(By.xpath("//span[contains(text(),'hello')]")) 包含匹配
driver.findElement(By.xpath("//span[text()='新闻']")) 绝对匹配
相关文章推荐
- webdriver与浏览器_操作页面元素—单选按钮/多选按钮
- python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。
- 【selenium webdriver】 XPath 多条件查询语句(处理同一个页面上出现相同文本按钮的动态ID元素定位)
- WCF X.b 操作引用了已经从 Y.b 操作导出的消息元素 [http://tempuri.org/:b]。可以通过更改方法名称或使用 OperationContractAttribute 的 Name 属性更改其中一个操作的名称...
- 18.雪碧 网页小图片的使用,可以将它们设置到一张大图上,然后用背景距离调控他们出现的位置!
- webdriver定位页面元素时使用set_page_load_time()和JavaScript停止页面加载
- 对于集合的遍历操作,可以使用 itrator foreach for 循环,下面比较一下各自的优缺点
- 使用selenium+python;在页面A点击一个按钮跳转到页面B,页面A没有关闭,浏览器打开了一个B,切换窗口定位页面B的元素
- webdrive——frame嵌套页面元素定位,多窗口切换操作,警告弹框处理
- 给定一个整数数组,两个数字的返回索引将它们加到一个特定的目标中。 您可以假设每个输入都只有一个解决方案,并且您可能不会两次使用相同的元素。
- Android 真机,微信打开 H5,切换到 webview,能通过 webdriver 方法操作页面元素,然后链接到新的 H5 页面后,无法操作元素,appium 服务器没有收到 response,
- 获取iframe中的内容、查找获取指定元素(关于用c++调用WEBBROWSER控件,使用相关接口操作web页面元素的一些方法)
- c#---部分;把数组或者结构体存入集合里,然后再从集合中取出之后,输出;foreach既可以用到提取数组重点额数据,也可以提取集合中的数据(前提是集合中的元素是相同数据类型)
- 在Selenium WebDriver中使用By.Xpath快速定位页面元素
- 鼠标悬停时,使用xpath定位页面按钮元素
- 在页面里点击一个按钮后出来一个层,可以操作的那么一个层!
- 在Selenium WebDriver中使用By.Xpath快速定位页面元素
- webdriver加载jQuery代码,并且使用jQuery的写法来定位元素及操作
- 在使用selenium webdriver进行元素定位时,通常使用findElement或findElements方法结合By类返回的元素句柄来定位元素。其中By类的常用定位方式共八种,现分别介绍如下
- 如何在 Watir 中使用 XPath 定位和操作页面元素