• Seleniumwebdriver系列教程(四)————如何定位测试元素


    测试对象定位一般都是各种web自动化测试框架或工具的核心内容。

    selenium-Webdriver的对象定位方法非常的丰富和强大。一般来说强大的对象定位都会提供如下的一些方法。

    • 单个对象的定位方法

    • 多个对象的定位方法

    • 层级定位

    selenium-Webdriver很好的支持了上述的3种定位方式。

    定位单个对象

    在定位单个对象时,selenium-Webdriver支持使用如下的一些属性对元素进行定位。

    :class             => 'class name',
    :class_name        => 'class name',
    :css               => 'css selector',
    :id                => 'id',
    :link              => 'link text',
    :link_text         => 'link text',
    :name              => 'name',
    :partial_link_text => 'partial link text',
    :tag_name          => 'tag name',
    : xpath             => 'xpath',
    
    

    使用class或class_name进行定位

    当所定位的对象具有class属性的时候我们可以通过class或class_name来定位该对象。

    下面的例子定位了google首页上class为”gsfi”的input。

    
    require 'selenium-webdriver'
    
    url = %q{http://www.google.com/}
    
    dr = Selenium::WebDriver.for :chrome
    dr.navigate.to url
    sleep 3
    
    new_icon = dr.find_element(:class => 'gsfi')
    puts new_icon.tag_name # ---> span

    使用id属性定位

    google首页的搜索输入框的html代码如下:

    <input class="gsfi" disabled="" autocomplete="off" style="border: medium none; padding: 0pt; margin: 0pt; height: auto; 100%; position: absolute; z-index: 1; background-color: transparent; color: silver; left: 0px; visibility: hidden;" id="gs_htif0" dir="ltr">

    在进行定位前我们先动态定义highlight方法,该方法的作用是高亮显示有id属性的页面元素。

    随后的代码演示了如何使用id属性来定位google首页上的搜索输入框。

    require 'selenium-webdriver'

    Selenium::WebDriver::Element.module_eval do
        def highlight
            e_id = self.attribute('id')
            puts "#{e_id} = e_id"
            js = <<JS
            document.getElementById("#{e_id}").style.border="3px solid red"
    JS
            @bridge.executeScript(js) if e_id
        end
    end
        url = %q{http://www.google.com}
        
        dr = Selenium::WebDriver.for :chrome
        dr.navigate.to url
        sleep 3
        
        s_input = dr.find_element(:id=>'gs_tti0')
        s_input.highlight

    当使用id定位到正确的元素后,highlight方法会将该元素以红色高亮显示,借此也可以验证代码是否工作正常。

    使用name属性定位

    soso首页的搜索输入框的html代码如下:

    <input type="text" name="w" smartpid="sb.idx" smartch="sb.c.idx" autocomplete="off" id="s_input" value="">
    
    # 同样定位soso首页的搜索框
    
    require 'selenium-webdriver'

    Selenium::WebDriver::Element.module_eval do
        def highlight
            e_id = self.attribute('id')
            puts "#{e_id} = e_id"
            js = <<JS
            document.getElementById("#{e_id}").style.border = "3px solid red"
    JS
            @bridge.executeScript(js) if e_id
        end
    end

    url = %q{http://www.soso.com/}

    dr = Selenium::WebDriver.for :chrome
    dr.navigate.to url
    sleep 1

    s_input = dr.find_element(:name => 'w')
    s_input.highlight

    使用css属性定位

    soso首页的搜索输入框的html代码如下:

    <input type="text" name="w" smartpid="sb.idx" smartch="sb.c.idx" autocomplete="off" id="s_input" value="">
    

    官方文档上说Selenium-WebDriver支持css3语法,这对使用jquery的同学来说无疑是一个好消息。

    # css属性定位soso首页搜索框
    s_input = dr.find_element(:css => '#s_input')

    使用xpath定位

    soso首页的搜索输入框的html代码如下:

    <input type="text" name="w" smartpid="sb.idx" smartch="sb.c.idx" autocomplete="off" id="s_input" value="">
    
    # 使用xpath定位soso首页搜索框
    s_input = dr.find_element(:xpath => %Q{//input[@id='s_input' and @name='w']})
    
    

    使用其他方式定位

    在定位link对象的时候,可以使用link和link_text属性;

    另外还可以使用tag_name属性定位任意元素;

    定位多个元素

    find_elements方法可以定位一组对象,例如

    # 定位页面上所有的link对象
    all_links = driver.find_elements(:tag_name, 'a')
    all_links.each do |l| puts l.class # ---> Selenium::WebDriver::Element
    end

    上面的代码返回页面上所有link对象的数组

    层级定位

    层级定位的思想是先定位父对象,然后再从父对象中精确定位出其我们需要选取的后代元素。

    层级定位一般的应用场景是无法直接定位到需要选取的元素,但是其父元素比较容易定位,通过定位父元素再遍历其子元素选择需要的目标元素,或者需要定位某个元素下所有的子元素。

    下面的代码演示了如何使用层级定位选取id为bm的div下所有的link元素,并打印出所有其href

    links = dr.find_element(:id, 'bm').find_elements(:css => 'a')
    links.each do |l|
        puts l['href']
    end
    
     
  • 相关阅读:
    R并行计算
    VMware虚拟机安装linux系统
    爬虫资料
    R-shiny服务器安装及配置
    数模国赛——致病基因
    vs 2013远程调试
    获取url的hash值
    JavaScript调试技巧之console.log()详解
    无法打开登录所请求的数据库
    location.host 与 location.hostname 的区别
  • 原文地址:https://www.cnblogs.com/timsheng/p/2547857.html
Copyright © 2020-2023  润新知