1、元素定位方法

selenium提供了八种方式来定位页面元素,分别是:

  • id
  • name
  • class name
  • tag name
  • link text
  • partial link text
  • xpath
  • css selector

这八种定位方式在selenium中对应的方法为:

  • findElement(By.id())
  • findElement(By.name())
  • findElement(By.className())
  • findElement(By.tagName())
  • findElement(By.linkText())
  • findElement(By.partialLinkText())
  • findElement(By.xpath())
  • findElement(By.cssSelector())

2、定位方法的用法

假如我们有一个web页面,通过浏览器开发者工具查看其源代码如下:

file

现在我们需要定位input标签输入框,可以通过如下方法:

  • 通过id定位

    driver.findElement(By.id(“kw”))

  • 通过name定位

    driver.findElement(By.name(“wd”))

  • 通过class name定位

    driver.findElement(By.className(“s_ipt”))

  • 通过tag name定位

    driver.findElement(By.tagName(“input”))

通过xpath定位,xpath定位有很多种写法,这里列几个常用写法

driver.findElement(By.xpath("//*[@id=’kw’]"))

driver.findElement(By.xpath("//*[@name=’wd’]"))

driver.findElement(By.xpath("//input[@class=’s_ipt’]"))

driver.findElement(By.xpath("/html/body/form/span/input"))

driver.findElement(By.xpath("//span[@class=’soutu-btn’]/input"))

driver.findElement(By.xpath("//form[@id=’form’]/span/input"))

driver.findElement(By.xpath("//input[@id=’kw’ and @name=’wd’]"))

通过css定位,css定位有很多种写法,这里列几个常用写法

driver.findElement(By.cssSelector("#kw")

driver.findElement(By.cssSelector("[name=wd]")

driver.findElement(By.cssSelector(".s_ipt")

driver.findElement(By.cssSelector("html > body > form > span > input")

driver.findElement(By.cssSelector("span.soutu-btn> input#kw")

driver.findElement(By.cssSelector("form#form > span > input")

接下来,假设页面上有一组文本链接

file

通过link text定位

driver.findElement(By.linkText("新闻")

driver.findElement(By.linkText("hao123")

通过partial link text定位

driver.findElement(By.partialLinkText("新")

driver.findElement(By.partialLinkText("hao")

driver.findElement(By.partialLinkText("123")

关于xpath和css具体如何定位的方法比较复杂,可以参考:

xpath:http://www.w3school.com.cn/xpath/xpath_syntax.asp

css:http://www.w3school.com.cn/cssref/css_selectors.asp

3、踩坑点

有时候会出现用以上方法怎么都定位不到元素的情况,原因是什么呢,接下来我根据自身经验和大家讲讲如何判断踩了哪个坑。

3.1 有多个属性值相同的元素

当我们用id name等方法来定位元素时,有时候页面上有多个id name值相同的元素,这时候你只能定位到第一个符合条件的元素,那该怎么办呢,可以使用定位一组元素的方法。

  • findElements(By.id())
  • findElements(By.name())
  • findElements(By.className())
  • findElements(By.tagName())
  • findElements(By.linkText())
  • findElements(By.partialLinkText())
  • findElements(By.xpath())
  • findElements(By.cssSelector())

这些方法返回的是一个符合条件的元素的数组,我们可以根据下标来获取需要的元素。

3.2 元素不可见

有时候页面上明明有这个元素,也没有别的很特殊的情况,就只是很普通的一个定位方法,那么很有可能是该元素处于不可见状态。我们可以采用两个方法来避免这个情况发生,一是启动浏览器后使用driver.manage().window().maximize()方法使浏览器最大化,二是使用Thread.sleep()使线程休眠,防止出现定位元素时元素还没加载出来的情况发生。

3.3 元素处在iframe中

在Web应用中经常会遇到frame/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌页面上的元素无法直接定位。这时就需要通过switchTo().frame()方法将当前定位的主体切换为frame/iframe表单的内嵌页面中。

file

126邮箱登录框的结构大概是这样子的,想要操作登录框必须要先切换到iframe表单。

file

如果完成了在当前表单上的操作,则可以通过switchTo().defaultContent()方法跳出表单。回到原来的主界面继续对其他元素进行操作。

分类: 测试

发表评论

电子邮件地址不会被公开。