Selenium 定位网页元素

第一 定位元素辅助工具

IE中在元素上右击 ->  “检查元素”,或按F12键打开开发者工具;

Chrome中在元素上右击 -> “审查元素”,或按F12键打开开发者工具;

Firefox中在元素上右击 -> “检查元素”,或安装插件Firebug打开开发者工具;

http://getfirebug.com/

Firefox中可以安装xPathChecker通过xpath定位页面上元素。

https://addons.mozilla.org/zh-CN/firefox/addon/xpath-checker/

只要把firebug的箭头放到要定位的元素上,就可以得到该元素对应标签的值,其他浏览器中类似。

第二 查找方法

以翼支付门户网站为例,演示通过name, id, class, linkText, partialLinkText, css selector等属性来定位这个输入框。

// <input name="productNo" id="phoneNo" type="text" maxlength="11" class="ui-txtinput01" autocomplete="off" value="请输入手机号"/>

/**
* <li class="login-btn01">
<a class="ui-button ui-button-morange ui-loginbutton" id="telLoginButtn" href="javascript:void(0);">登&nbsp;&nbsp;录</a>
</li>
*/

1.通过id查找是最有效、最方便的方法
WebElement phoneNoById = driver.findElement(By.id("phoneNo"));

WebElement loginById = driver.findElement(By.id("telLoginButtn"));

2.通过name查找,跟id类似的方法
WebElement phoneNoByName = driver.findElement(By.name("productNo"));

3.通过class name查找,对某些具有相同类的元素一网打尽的好方法,如果整个页面只有一个元素使用了该class也可以使用。
WebElement phoneNoByClassname = driver.findElement(By.className("ui-txtinput01"));

4. 通过link text 和 partial link text查找,用在定位超链接上比较多。

WebElement loginByLinkedText = driver.findElement(By.linkText("登 录"));
WebElement loginByPartialLinkText = driver.findElement(By.partialLinkText("登"));

5. 通过css selector查找也是常用的查找方法,各种浏览器支持都很好,查找速度很快。
WebElement loginByCssSelector = driver.findElement(By.cssSelector("a.ui-button.ui-button-morange.ui-loginbutton"));

定位id为flrs的div元素,可以写成:#flrs, 注:相当于xpath语法的//div[@id=’flrs’]
定位id为flrs下的a元素,可以写成 #flrs > a,  注:相当于xpath语法的//div[@id=’flrs’]/a
定位id为flrs下的href属性值为/forexample/about.html的元素,可以写成: #flrs > a[href=”/forexample/about.html”]
如果需要指定多个属性值时,可以逐一加在后面,如#flrs > input[name=”username”][type=”text”]

6. 通过xpath查找是万不得已的方法,在以上几种方法都无法找到的时候使用xpath查找,几乎可以定位到页面上的任意元素,但定位性能不是很好,所以还是尽量少用。可以使用Firefox中所安装的xPathCecker插件检查xpath是否正确。绝对路径以单/号表示,相对路径则以//表示。当xpath的路径以/开头时,表示让Xpath解析引擎从文档的根节点开始解析。当xpath路径以//开头时,则表示让xpath引擎从文档的任意符合的元素节点开始进行解析。而当/出现在xpath路径中时,则表示寻找父节点的直接子节点,当//出现在xpath路径中时,表示寻找父节点下任意符合条件的子节点,不管嵌套了多少层级。

WebElement phoneNoByXpath1 = driver.findElement(By.xpath("//input[@id=‘phoneNo‘]"));WebElement phoneNoByXpath2 = driver.findElement(By.xpath("//input[@name=‘productNo‘]"));WebElement phoneNoByXpath3 = driver.findElement(By.xpath("//input[@class=‘ui-txtinput01‘]"));WebElement loginByXpath1 = driver.findElement(By.xpath("//a[contains(@href, ‘javascript‘)]"));WebElement loginByXpath2 = driver.findElement(By.xpath("//a[starts-with(@class,‘ui-button‘)]"));

7. 当要定位一组元素相同元素时,除了通过name查找还可以通过tagName查找。该方法通过元素的标签名称来查找元素,搜索到的元素通常不止一个,所以一般结合findElements方法来使用。

List<WebElement> buttons = driver.findElements(By.tagName("button"));List<WebElement> inputs = driver.findElements(By.tagName("input"));List<WebElement> aLinks = driver.findElements(By.tagName("a"));

8. 有些特别的元素,如翼支付首页面上鼠标悬浮在“生活服务”上时“水电煤缴费”才会显示,查找困难,可以直接在driver中执行js代码。

// <a class="header-tab-a" href="/appcenter/lifepay/water">水电煤缴费</a>JavascriptExecutor js = (JavascriptExecutor) driver;String myjs="document.getElementsByClassName(‘header-tab-a‘)[0].click()";js.executeScript(myjs);

9. 有些页面使用了iframe控件来访问另外一个网页,iframe控件中的元素不能直接找到,必须要先switch到iframe中才能找到。

WebElement elementInFrame = driver.switchTo().frame("frameID").findElement(By.xpath("//a[@id=‘signIn‘]/input"));

如果一个网页有个frame内部还内嵌了一个frame,就需要先switch到第一个frame,再switch到第二个frame。

//先找到ifrome1(id = f1)driver.switchTo().frame("f1");//再找到其下面的ifrome2(id =f2)driver.switchTo().frame("f2");//下面就可以正常的操作元素了driver.findElement(By.id("kw")).sendKeys("selenium");driver.findElement(By.id("su")).click();

如果一个网页有两个兄弟frame,已经switch到第一个frame中后想查找第二个frame中的元素,就需要先switch到defaultContent,再switch到第二个frame。

//先找到到ifrome1(id = f1)driver.switchTo().frame("f1");driver.findElement(By.id("kw")).sendKeys("selenium");driver.findElement(By.id("su")).click();//再找到其下面的ifrome2(id =f2)driver.switchTo().defaultContent();driver.switchTo().frame("f2");//下面就可以正常的操作元素了driver.findElement(By.id("kw")).sendKeys("selenium");driver.findElement(By.id("su")).click();

10. webdriver常常在元素还没有加载出来就查找,会出现Cannot find elements错误。此时可以通过3种等待方式让webdriver稍等一会。

显式等待,就是要等到代码中使用了显式等待的元素满足指定的ExpectedCondition,等不到,就一直等,除非在规定的超时时间之内都没找到,那么就跳出Exception.

WebElement myDynamicElement = (new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(By.xpath("")));

有很多显示等待的等待条件可以设置,具体查见ExpectedConditions类的方法:

隐式等待是针对webdriver设置的,webdriver查找任意一个元素时,如果找不到都会等待此处设置的时间。

driver.manage().timeouts().implicitlyWait(100, TimeUnit.SECONDS);

线程等待是让程序等待一个固定的时间,不建议使用。

Thread.sleep(waitTime)

				
时间: 2024-08-10 06:28:02

Selenium 定位网页元素的相关文章

使用Selenium对网页元素进行定位的诸种方法

使用Selenium进行自动化操作,首先要做的就是通过webdriver的get()方法打开一个URL链接. 在打开链接,完成页面加载之后,就可以通过Selenium提供的接口,在页面上进行各种操作了,下面我们来了解一下如何在查找元素. 3.1 查找和定位网页元素 在上一篇的示例中,我们就演示了如何通过find_element_by_id()方法,根据元素的id值来定位页面元素. 除了根据元素的id值来查找元素外,Selenium还提供了很多查找元素的方法: 从上图中可以看到,Selenium提

第八章 定位网页元素

一.position属性定位网页元素 1.static :默认值,没有定位.按照标准文档流的方式提现出来 2.relative:相对定位,相对于自身元素原来的位置进行定位 <style type="text/css">     .div01{      position: relative;      top: -20px;      left: 20px;     } </style> 注意:当top的值为正值时向下移动       当为负值时向上移动 当le

Selenium定位HTML元素(Python)

本篇不是介绍通过各种方法(id, name, tag_name, css, xpath等)定位HTML各元素的普及性文章,网络上各种文档和博客介绍得均比较全面.这里只是将自己实践中,遇到的个别问题及解决方案进行记录. 在此推荐Selenium官方文档(Python版):http://selenium.googlecode.com/svn/trunk/docs/api/py/index.html 可以搜索关键字,得到函数用法和源码. 下面记录定位HTML元素方面遇到的问题和解决方法(持续更新).

Selenium 定位一组元素

到目前为止,我们已经知道了怎么去定位一个元素,有时候我们需要获取页面上的多个元素,该怎么办呢?难道还一个一个地去定位,那也太lower了吧. webdriver提供了定位一组元素的方法,跟前面讲的那八种定位方法一样,只不过定位一个元素是单数:find_element,定位一组元素是复数:find_elements 我们以百度搜索结果页面为例. 在百度搜索框输入"selenium",点击"百度一下"按钮,查看页面元素 从搜索结果的页面html代码可以看到,每条搜索结果

HTML_定位网页元素

一.position属性 意指:盒子的位置. 四个属性: 1.static:默认值,没有定位,元素按照标准文档流进行布局. 2.relative:相对定位,使用相对定位的盒子位置以标准文档流进行的排办方式为基础,然后使盒子相对于他原本的位置偏移指定的距离.相对定位的盒子仍然在标准文档流中,其后的盒子仍以标准文档流当是对待它. 3.absolute:绝对定位,盒子的位置以包含他的盒子为基准进行偏移.绝对定位的盒子从标准文档流中脱离.这意味着他们对其后的其他盒子的定位没有影响,对于其他的盒子来说就好

【selenium学习笔记一】python + selenium定位页面元素的办法。

1.什么是Selenium,为什么web测试,大家都用它? Selenium设计初衷就是为web项目的验收测试再开发.内核使用的是javaScript语言编写,几乎支持所以能运行javaScript的浏览器,支持windows\linux\macos等各种平台. Selenium 脚本是用多种受支持的编程语言中的一种编写的 —— 目前可用的有 Java.Ruby 和 Python 驱动程序.这些脚本在浏览器之外的一个单独的进程中运行.驱动程序的任务是执行测试脚本,并通过与运行在浏览器中的 bro

python + selenium定位页面元素的办法

1.什么是Selenium,为什么web测试,大家都用它? Selenium设计初衷就是为web项目的验收测试再开发.内核使用的是javaScript语言编写,几乎支持所以能运行javaScript的浏览器,支持windows\linux\macos等各种平台. Selenium 脚本是用多种受支持的编程语言中的一种编写的 -- 目前可用的有 Java.Ruby 和 Python 驱动程序.这些脚本在浏览器之外的一个单独的进程中运行.驱动程序的任务是执行测试脚本,并通过与运行在浏览器中的 bro

定位网页元素

一.定位--position属性 1.static:默认值 没有定位--以标准文档流方式显示 2.relative:相对定位--相对自身原来的位置进行偏移(top left right bottom) 3.absolute:绝对定位 4.fixed:固定定位 二.相对定位元素的规律 1.设置相对定位的盒子会相对它原来的位置,通过指定偏移到达新的位置 2.设置相对定位的盒子仍在标准文档流中,它对父级盒子和相邻盒子都没有影响 三.绝对定位-- absolute属性 1.偏移位置:left right

定位网页元素(5)

1.元素定位(position) static:默认 relative:相对定位 absolute:绝对定位 flxed:固定定位(建议不要用,部分浏览器不兼容)2.层叠关系(z-index) 默认值为:0 值可以是任何整数 值越大,位置在越前面3.透明度 opacity:0~1值越小越透明 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xht