精华内容
下载资源
问答
  • UI自动化测试元素定位方法

    千次阅读 2019-02-11 14:58:50
    Selenium进行自动化测试元素定位 Selenium Webdriver 通常使用findelement或者findelements方法结合By类返回元素句柄来进行元素定位 其中By常用的定位方式有8种: ·id ·name ·class name ·tag name ·link ...

    Python语言Selenium库UI自动化测试(一)元素定位方法

    简介
    当我们日常搭建自动化测试框架时,用Python调用浏览器时,通常有Requests库、Selenium库
    这两个库是进行爬虫或者自动化测试时必不可少的,语法都比较简答,这里先介绍Selenium库
    Selenium主要分为2部分,Selenium和WebDrive,Selenium和Requests一样,进行API调用等操作,WebDrive是调用浏览器并定位浏览器的元素进行一些操作
    我是直接参考官方文档,内容也比较少,就把官方文档里的常用方法梳理出来大家看看了
    (官方文档地址:https://docs.seleniumhq.org/docs/03_webdriver.jsp#how-does-webdriver-drive-the-browser-compared-to-selenium-rc)

    下面我们来看看一些常用的方法

    调用浏览器

    这里需要注意的是,我们需要针对不同版本的安装不同的浏览器版本和不同的浏览器驱动,我自己是Selenium 3.14 +Firefox 52 + geckodriver V0.11.1.rar*(https://blog.csdn.net/sevensolo/article/details/93410613)*
    网上还有很多其他的,大家可以本地装起来看下

    定位UI元素

    定位方法的用法:
    打开Web页面,查看源代码(可以使用F12或Firebug),可以查看元素的属性

    Selenium Webdriver
    通常使用findelement或者findelements方法结合By类返回元素句柄来进行元素定位
    其中By常用的定位方式有8种:

    ·By ID
    ·By Class Name
    ·By Tag Name
    ·By Name
    ·By Link Text
    ·By Partial Link Textzhi
    ·By CSS Seletor
    ·By XPath

    这8种定位方式在Python 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())**

    By ID

    · 官方实例

    <div id="coolestWidgetEvah">...</div>
    

    最常用也是最简单的方式,通过id定位UI页面元素

    调用方法

    element = driver.find_element_by_id("coolestWidgetEvah")
    
    or
    
    from selenium.webdriver.common.by import By
    element = driver.find_element(by=By.ID, value="coolestWidgetEvah")
    

    如果你要获取的页面元素标签是id,那么可以通过id来进行定位

    · By ID实例

    源代码如下:

    <html>
      <head>
      <body link="#0000cc">
        <a id="result_logo" href="/" onmousedown="return c({'fm':'tab','tab':'logo'})">
        <form id="form" class="fm" name="f" action="/s">
          <span class="soutu-btn"></span>
            <input id="kw" class="s_ipt" name="wd" value="" maxlength="255" autocomplete="off">
    

    需要定位input标签的输入框
    方法如下:

    driver.findElement(by.id("kw"))
    

    By Class Name

    · 官方实例

      <div class="cheese"><span>Cheddar</span></div><div class="cheese"><span>Gouda</span></div>
    

    如果定位的元素是Class命名的,我们用这个方法,需要注意的是,用Class命名的通常很多元素都是Class,可以仔细看下上面的例子
    只是赋予不同的值

    调用方法

    cheeses = driver.find_elements_by_class_name("cheese")
    
    or
    
    from selenium.webdriver.common.by import By
    cheeses = driver.find_elements(By.CLASS_NAME, "cheese")
    

    · By Class Name实例

    该方法可以通过元素的标签名称来查找元素。该方法跟之前两个方法的区别是,这个方法搜索到的元素通常不止一个,所以一般建议结合使用findElements方法来使用。比如我们现在要查找页面上有多少个button,就可以用button这个tagName来进行查找
    源代码如下:

    <button type="button" class="el-button el-button--primary el-button--medium" style="width: 100%; height: 42px; margin-top: 12px;"><!----><!----><span>登 录</span></button>
    

    想要定位登录元素方法如下:

    driver.findElement(By.className("el-button el-button--primary el-button--medium"))
    

    注意:使用className来进行元素定位时,有时会碰到一个元素指定了若干个class属性值的“复合样式”的情况,如下面这个button:登录。这个button元素指定了三个不同的css伪类名作为它的样式属性值,此时就必须结合后面要介绍的cssSelector方法来定位了,稍后会有详细例子。

    By Tag Name

    · 官方实例

    <iframe src="..."></iframe>
    

    如果使用的是Tag Name,我们用这个方法

    frame = driver.find_element_by_tag_name("iframe")
    
    or
    
    from selenium.webdriver.common.by import By
    frame = driver.find_element(By.TAG_NAME, "iframe")
    

    · By Tag Name实例

    该方法可以通过元素的标签名称来查找元素。该方法跟之前两个方法的区别是,这个方法搜索到的元素通常不止一个,所以一般建议结合使用findElements方法来使用。
    源代码:

    <input type="password" autocomplete="off" name="password" placeholder="请输入登录密码" class="el-input__inner">
    

    另外,在使用tagName方法进行定位时,还有一个地方需要注意,通常有些HTML元素的tagName是相同的,单选框、复选框、文本框和密码框的元素标签都是input,此时单靠tagName无法准确地得到我们想要的元素,需要结合type属性才能过滤出我们要的元素

    需要定位密码输入框

    driver.findElement(By.tagName("el-input__inner"))
    	# 过滤出想要的元素
    	for i in inputs:
    		if type = 'password'
    			pass
    

    By Name

    · 官方实例

    <input name="cheese" type="text"/>
    

    定位方法

    cheese = driver.find_element_by_name("cheese")
    
    or
    
    from selenium.webdriver.common.by import By
    cheese = driver.find_element(By.NAME, "cheese")
    

    · By Name实例
    源代码如下:

    <input type="text" autocomplete="off" name="username" placeholder="请输入用户名登录" class="el-input__inner">
    

    需要定位输入用户名输入框
    方法如下:

    driver.findElement(By.name("username"))
    

    By Link Text

    · 官方实例

    <a href="http://www.google.com/search?q=cheese">cheese</a>>
    

    定位方法

    cheese = driver.find_element_by_link_text("cheese")
    
    or
    
    from selenium.webdriver.common.by import By
    cheese = driver.find_element(By.LINK_TEXT, "cheese")
    

    · By Link Text实例

    这个方法是通过超文本链接上的文字信息来定位元素,这种方式一般专门用于定位页面上的超文本链接。
    超文本链接源代码:

    <a href="/wi_user_register.php" style="float: right; line-height: 22px; color: rgb(96, 98, 102); font-size: 15px;"><span style="float: left; margin-right: 3px;">立即注册</span><span class="sanjiao"></span></a>
    

    需要定位注册元素
    代码如下:

    driver.findElement(By.linkText("立即注册"))
    

    By Partial Link Text

    · 官方实例

    <a href="http://www.google.com/search?q=cheese">cheese</a>>
    

    定位方法

    cheese = driver.find_element_by_link_text("cheese")
    
    or
    
    from selenium.webdriver.common.by import By
    cheese = driver.find_element(By.LINK_TEXT, "cheese")
    

    By Partial Link Text实例

    这个方法是By Link Text的扩展。当不能确定超链接的文本信息或者只通过一些关键字进行匹配时,可以使用这个方法进行匹配

    <a href="/wi_user_register.php" style="float: right; line-height: 22px; color: rgb(96, 98, 102); font-size: 15px;"><span style="float: left; margin-right: 3px;">立即注册</span><span class="sanjiao"></span></a>
    

    需要定位注册元素
    代码如下:

    driver.findElement(By.partialLinkText("立"))
    driver.findElement(By.partialLinkText("即"))
    driver.findElement(By.partialLinkText("注"))
    driver.findElement(By.partialLinkText("册"))
    

    By CSS

    · 官方实例

    <div id="food"><span class="dairy">milk</span><span class="dairy aged">cheese</span></div>
    

    定位方法

    cheese = driver.find_element_by_css_selector("#food span.dairy.aged")
    
    or
    
    from selenium.webdriver.common.by import By
    cheese = driver.find_element(By.CSS_SELECTOR, "#food span.dairy.aged")
    

    By CSS实例

    cssSelector元素定位方式跟xpath比较类似,但执行速度较快,而且各种浏览器对它的支持很到位
    百度首页为例
    在这里插入图片描述
    单一属性定位:

    # type selector 定位
    driver.find_element_by_css_selector('input')
    
    # id定位
    driver.find_element_by_css_selector('#kw')
    
    # class定位
    driver.find_element_by_css_selector('.s_ipt')
    
    # 其他属性定位
    driver.find_element_by_css_selector('[name='wd']')
    driver.find_element_by_css_selector("[type='text']")
    

    组合属性定位:

    # id组合属性定位
    driver.find_element_by_css_selector("input#kw")
    
    # class组合属性定位
    driver.find_element_by_css_selector("input.s_ipt")
    
    # 其他属性组合定位
    driver.find_element_by_css_selector("input[name='wd']")
    
    # 仅有属性名,没有值也可以
    driver.find_element_by_css_selector("input[name]")
    
    # 两个其他属性组合定位
    driver.find_element_by_css_selector("[name='wd'][autocomplete='off']")
    

    层级定位:

    # E>F    E下面的F这个元素
    #id是form的form下面的span下面的input
    driver.find_element_by_css_selector('from#form>span>input')
    # E:nth-child(n)  
    # E:nth-last-child(n),如字面意思:倒数第几个标签
    # E:first-child,第一个标签
    # E:last-child,最后一个标签
    # E:only-child,唯一的标签
    

    By XPath

    需要注意的是XPath需要安装XPath寻找器,我FireFox上装的是XPath Finder这个插件
    在这里插入图片描述

    · 官方实例

    <input type="text" name="example" />
    <INPUT type="text" name="other" />
    

    使用方法

    inputs = driver.find_elements_by_xpath("//input")
    
    or
    
    from selenium.webdriver.common.by import By
    inputs = driver.find_elements(By.XPATH, "//input")
    

    · By XPath实例

    XPath是XML Path的简称,由于HTML文档本身就是一个标准的XML页面。这个方法是非常强大的元素查找方式,使用这种方法几乎可以定位到页面上的任意元素。
    XPath,这里只简单介绍,需要深入了解的,可以自己找资料学下,附上w3school的学习地址
    http://www.w3school.com.cn/xpath/xpath_syntax.asp

    Xpath的路径分为:
    绝对路径 /
    相对路径 //

    Xpath路径应用举例:

     # 使用绝对路径
     By.xpath("html/body/div/form/input")
    
     # 使用相对路径
     By.xpath("//input//div")
    
     # 使用元素定位
     By.xpath("//input[4]")
    
     # 使用xpath相对路径和节点属性定位
     By.xpath("//input[@id='kw']")
     By.xpath("//input[@type='name' and @name='kw']")
    
     # 使用部分属性值匹配(最强大方法)
     By.xpath("//input[start-with(@id,'nice')]")
     By.xpath("//input[start-with(@id,'很漂亮')]")
     By.xpath("//input[start-with(@id,'很美丽')]")
    
     # 所有方法混合使用
     By.xpath("//input[@id='kw1']//input[start-with(@id,'nice']/div[1]/form[3])
    

    注意: XPath的定位方式,webdriver会将整个页面的所有元素进行扫描以定位我们所需要的元素,所以这是一个非常费时的操作,如果你的脚本中大量使用xpath做元素定位的话,将导致你的脚本执行速度大大降低,所以请慎用。

    展开全文
  • 自动化测试元素定位

    千次阅读 2017-03-13 22:50:42
    自动化测试最基础的就是要先找到待操作的元素,有八种定位方法,下面会一一介绍。1、什么是元素:HTML 元素指的是从开始标签(start tag)到结束标签(end tag)的所有代码。2、查找一个元素driver.findElement(By...

    做自动化测试最基础的就是要先找到待操作的元素,有八种定位方法,下面会一一介绍。

    1、什么是元素:HTML 元素指的是从开始标签(start tag)到结束标签(end tag)的所有代码。

    2、查找一个元素driver.findElement(By.XX(“XXX”));
    查找一组元素driver.findElements(By.XX(“XXX”));

    3、By.name()
    源码如下:<button id="gbqfba" name="btnk" class="gbqfba"><span id="gbqfsa"></span></button>当我们要用name属性来引用这个button并点击它时,代码如下:

    public class SearchButtonByName { 
        public static void main(String[] args){ 
            WebDriver driver = new FirefoxDriver(); 
            driver.get("http://www.forexample.com"); 
            WebElement searchBox = driver.findElement(By.name("btnK")); 
            searchBox.click();
    }
    }

    只要该元素的任意一个属性是唯一的,即可通过该属性进行定位,上面用到的是by.name,所以通过name进行定位。

    4、By.id()
    页面源码如下:

    <button id="gbqfba" aria-label="Google Search" name="btnK" class="gbqfba">
    <span id="gbqfsa">Google Search</span>
    </button>

    要引用该button并点击它时,代码如下:

    public class SearchButtonById {
        public static void main(String[] args){
            WebDriver driver = new FirefoxDriver();
            driver.get("http://www.forexample.com");
            WebElement searchBox = driver.findElement(By.id("gbqfba"));
            searchBox.click();
    }
    }

    5、By.tagName()
    tag有标签的意思,html中<a><body><div><form>等都是标签,by.tagName()可以通过标签名查找元素。该方法可以通过元素的标签名称来查找元素。这个方法搜索到的元素通常不止一个,所以一般结合findElements方法使用。比如我们现在要查找页面上有多少个button,就可以用button这个tagName来进行查找,代码如下:

    public class SearchPageByTagName{
        public static void main(String[] args){
            WebDriver driver = new FirefoxDriver();
            driver.get("http://www.forexample.com");
            List<WebElement> buttons =driver.findElements(By.tagName("button"));
        System.out.println(buttons.size()); 
        //打印出button的个数
        }
    } 

    另外,在使用tagName方法进行定位时,需要注意有些HTML元素的tagName是相同的,例如单选框、复选框、文本框、密码框等会使用input标签。这样单靠tagName无法准确地得到我们想要的元素,需要结合type属性准确定位。示例代码如下:

    public class SearchElementsByTagName{
        public static void main(String[] args){
            WebDriver driver = new FirefoxDriver();
            driver.get("http://www.forexample.com");
            List<WebElement> allInputs = driver.findElements(By.tagName("input"));
            //只打印所有文本框的值
            for(WebElement e: allInputs){
            if (e.getAttribute(“type”).equals(“text”)){
            System.out.println(e.getText().toString()); 
            //打印出每个文本框里的值
    }    }
    }
    }

    5、By.className()
    className属性是利用元素的css样式表所引用的伪类名称来进行元素查找的方法。对于任何HTML页面的元素来说,一般程序员或页面设计师会给元素直接赋予一个样式属性或者利用css文件里的伪类来定义元素样式,使元素在页面上显示时能够更加美观。引用样式如下:

    <button name="sampleBtnName" id="sampleBtnId" class="buttonStyle">I'm Button</button>

    如果此时我们要通过className属性来查找该button并操作它的话,就可以使用className属性了,代码如下:

    public class SearchElementsByClassName{
        public static void main(String[] args){
            WebDriver driver = new FirefoxDriver();
            driver.get("http://www.forexample.com");
            WebElement searchBox = driver.findElement(By.className("buttonStyle"));
            searchBox.sendKeys("Hello, world");
    }
    }

    注意:使用className来进行元素定位时,有时会碰到一个元素指定了若干个class属性值的“复合样式”的情况,例如:
    button:<button id="J_sidebar_login" class="btn btn_big btn_submit" type="submit">登录</button>
    这个button元素指定了三个不同的css伪类名作为它的样式属性值,用 . 连接不同的css伪类名即可。

    driver.findElement(By.cssSelector("button.btn.btn_big.btn_submit"))

    6、By.linkText()
    这个方法比较直接,即通过超文本链接上的文字信息来定位元素,这种方式一般专门用于定位页面上的超文本链接。通常一个超文本链接会长成这个样子:

    <a href="/intl/en/about.html">About Google</a>

    我们定位这个元素时,可以使用下面的代码进行操作:

    public class SearchElementsByLinkText{ 
        public static void main(String[] args){ 
            WebDriver driver = new FirefoxDriver(); 
            driver.get("http://www.forexample.com"); 
            WebElement aboutLink = driver.findElement(By.linkText("About Google")); 
            aboutLink.click(); 
    } }

    7、By.partialLinkText()
    这个方法是上一个方法的扩展。当你不能准确知道超链接上的文本信息或者只想通过一些关键字进行匹配时,可以使用这个方法来通过部分链接文字进行匹配。
    代码如下:

    public class SearchElementsByPartialLinkText{ 
        public static void main(String[] args){ 
            WebDriver driver = new FirefoxDriver(); 
            driver.get("http://www.forexample.com"); 
            WebElement aboutLink = driver.findElement(By.partialLinkText("About")); 
            aboutLink.click(); 
    } } 

    注意:使用这种方法进行定位时,如果页面中不止一个超链接包含About时,findElement方法只会返回第一个查找到的元素,而不会返回所有符合条件的元素。如果你要想获得所有符合条件的元素,还是只能使用findElements方法。

    8、By.xpath()
    这个方法是非常强大的元素查找方式,使用这种方法几乎可以定位到页面上的任意元素。在正式开始使用XPath进行定位前,我们先了解下什么是XPath。XPath是XML Path的简称,由于HTML文档本身就是一个标准的XML页面,所以我们可以使用XPath的语法来定位页面元素。
    我们以所示HTML代码为例:

    <html>
    <body>
    <form id="loginForm">
    <input name="username" type="text">
    <input name="password" type="text">
    <input name="username" type="text">
    <input name="continue" type="submit" value="Login">
    <input name="continue" type="submit" value="Clean">
    </form>
    </body>
    </html>

    Xpath绝对路径写法如下:引用页面上的form元素:/html/body/form[1]
    a.元素的xpath绝对路径可通过firebug直接查询。FireFox上也可以使用FirePath插件获取Xpath路径。chrome上选中元素,点击鼠标右键以Xpath的方式进行copy。
    b.一般不推荐使用绝对路径的写法,因为一旦页面结构发生变化,该路径也随之失效,必须重新写。
    c.当xpath的路径以/开头为绝对路径,表示让Xpath解析引擎从文档的根节点开始解析。Xpath中/表示寻找父节点的直接子节点
    e.当xpath路径以//开头为相对路径,则表示让xpath引擎从文档的任意符合的元素节点开始进行解析。Xpath中//表示寻找父节点下任意符合条件的子节点,不管嵌套多少层级。
    f.Xpath的路径中可以绝对路径和相对路径混合在一起来进行表示。
    g.使用逻辑符号连接两个属性//input[@id=’aa’ and @class=’bb’]/span/input

    Xpath相对路径的写法:
    a.查找页面根元素://
    b.查找页面上所有的input元素://input
    c.查找页面上第一个form元素内的直接子input元素(即只包括form元素的下一级input元素,使用绝对路径表示,单/号)://form[1]/input
    d.查找页面上第一个form元素内的所有子input元素(只要在form元素内的input都算,不管还嵌套了多少个其他标签,使用相对路径表示,双//号)://form[1]//input
    e.查找页面上第一个form元素://form[1]
    f.查找页面上id为loginForm的form元素://form[@id=’loginForm’]
    g.查找页面上具有name属性为username的input元素://input[@name=’username’]
    h.查找页面上id为loginForm的form元素下的第一个input元素://form[@id=’loginForm’]/input[1]
    i.查找页面具有name属性为contiune并且type属性为button的input元素://input[@name='continue'][@type='button']
    j.查找页面上id为loginForm的form元素下第4个input元素://form[@id=’loginForm’]/input[4]

    Xpath功能很强大,所以也可以写得更加复杂一些,如下图的HTML源码。

    如果我们现在要引用id为“J_password”的input元素,该怎么写呢?我们可以像下面这样写:

    WebElement password = driver.findElement(By.Xpath("//*[@id='J_login_form']/dl/dt/input[@id='J_password']"));

    也可以写成:

    WebElement password = driver.findElement(By.Xpath("//*[@id='J_login_form']/*/*/input[@id='J_password']"));

    这里解释一下,其中//*[@id='J_login_form']是指在根元素下查找任意id为J_login_form的元素,此时相当于引用到了form元素。后面的路径必须按照源码的层级依次往下写。我们要找的input元素包含在一个dt标签内,而dt又包含在dl标签内,所以中间必须写上dl和dt两层,才到input这层。当然我们也可以用*号省略具体的标签名称,但元素的层级关系必须体现出来,我们不能写成//*[@id='J_login_form']/input[@id='J_password']

    前面讲的都是xpath中基于准确元素属性的定位,其实xpath作为定位神器也可以用于模糊匹配。下图代码中的“退出”这个超链接,没有标准id元素,只有一个rel和href不好定位。我们用xpath的三种模糊匹配模式来定位它:

    a. 用contains关键字,定位代码如下:
    这句话的意思是寻找页面中href属性值包含有logout这个单词的所有a元素,由于这个退出按钮的href属性里肯定会包含logout,所以这种方式是可行的,也会经常用到。其中@后面可以跟该元素任意的属性名。

    driver.findElement(By.xpath(“//a[contains(@href, ‘logout’)]”));

    b. 用start-with,定位代码如下:
    这句的意思是寻找rel属性以nofo开头的a元素。其中@后面的rel可以替换成元素的任意其他属性。

    driver.findElement(By.xpath(“//a[starts-with(@rel, ‘nofo’)]));

    c. 用Text关键字,定位代码如下:
    这个方法可谓相当霸气啊。直接查找页面当中所有的退出二字,根本就不用知道它是个a元素了。这种方法也经常用于纯文字的查找。

    driver.findElement(By.xpath(“//*[text()=’退出’]));

    注意:Xpath这种定位方式,webdriver会将整个页面的所有元素进行扫描以定位我们所需要的元素,所以这是一个非常费时的操作,如果你的脚本中大量使用xpath做元素定位的话,将导致你的脚本执行速度大大降低,所以请慎用。

    9、By.cssSelector()
    cssSelector这种元素定位方式跟xpath比较类似,但执行速度较快,而且各种浏览器对它的支持都相当到位,所以功能也是蛮强大的。


    简单的语法看图即可,来个复杂的。定位id为flrs下的href属性值为/forexample/about.html的元素,可以写成: #flrs > a[href=”/forexample/about.html”],如果需要指定多个属性值时,可以逐一加在后面,如#flrs > input[name="username"][type="text"]
    明白基本语法后,我们来尝试用cssSelector方式来引用图1中选中的那个input对象,代码如下:

    WebElement password = driver.findElement(By.cssSelector("#J_login_form>dl>dt>input[id=’ J_password’]"));

    同样必须注意层级关系,这个不能省略。此外,cssSelector还有一些高级用法,熟练后可以更加方便地帮助我们定位元素,我们可以利用^用于匹配一个前缀,$用于匹配一个后缀,*用于匹配任意字符。如表格2

    最后总结一下,各种方式在选择的时候应该怎么选择:
    a.当页面元素有id属性时,最好尽量用id来定位。但由于现实项目中很多程序员其实写的代码并不规范,会缺少很多标准属性,这时就只有选择其他定位方法。
    b.xpath很强悍,但定位性能不是很好,所以还是尽量少用。如果确实少数元素不好定位,可以选择xpath或cssSelector。
    c.当要定位一组元素相同元素时,可以考虑用tagName或name。
    d.当有链接需要定位时,可以考虑linkText或partialLinkText方式。

    下面的代码是我写的关于CSDN自动登录的代码:

    package javaSelenium;
    
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.chrome.ChromeDriver;
    
    public class CsdnCreatBlog 
    {
        public static void main (String[] args){
            //设置浏览器驱动
            System.setProperty("webdriver.chrome.driver","/Users/liqingju/Downloads/chromedriver");
            //获取URL
            WebDriver driver = new ChromeDriver();
            driver.get("http://write.blog.csdn.net/postlist");
            //输入用户名和密码
            WebElement username = driver.findElement(By.xpath("//input[@id='username']"));
            username.clear();
            username.sendKeys("username");
            WebElement password = driver.findElement(By.xpath("//input[@id='password']"));
            password.clear();
            password.sendKeys("password");
            //点击登录
            waitTime(2000);
            WebElement logging = driver.findElement(By.xpath("//input[@class='logging']"));
            logging.click();
            waitTime(2000);
            //创建博客
            WebElement searchBox = driver.findElement(By.xpath("//ul[@class='tabs']/li[10]/a"));
            searchBox.click();
    
        }
    
        private static void waitTime(int i) {
            // TODO Auto-generated method stub
    
        }
    
    }
    
    文章部分引用于测试控的[Selenium Webdriver元素定位的八种常用方式](http://www.cnblogs.com/qingchunjun/p/4208159.html),码字不易,向作者致敬。
    在学习使用的过程中我会不断优化文章,保持更新。
    最后希望您转载请注明出处!
    
    展开全文
  • 自动化测试中获取页面元素

    千次阅读 2017-12-28 16:38:52
    到目前为止也只做了几月测试,自动化测试脚本写了不超过十。但是借助公司原有的框架,感觉还是学到很多东西,有必要整理记录。 1.普通的html标签: 通过id, xpath即可得到。 2.伪元素:即紧跟在标签之后的:...
    到目前为止也只做了几个月测试,自动化测试脚本写了不超过十个。但是借助公司原有的框架,感觉还是学到很多东西,有必要整理记录。
    1.普通的html标签: 通过id, xpath即可得到。
    2.伪元素:即紧跟在标签之后的:before, :after 等元素,有时候某些验证点在这些伪元素的css属性当中,通过xpath获取不到这些伪元素, css selector 也没有找到合适的方法可以得到。因此伪元素是通过执行JavaScript语句得到的,代码如下: 

      String script1 = "return window.getComputedStyle(document.querySelectorAll('.sizing-tool .tab-content .checkbox-group')["    + i + "],':before').getPropertyValue('background-color')";

    JavascriptExecutor js = (JavascriptExecutor) driver;

    String content = (String) js.executeScript(script1);

      这句代码的解析: String script1 = "return window.getComputedStyle(document.querySelectorAll('css selector')[index],':before/:after').getPropertyValue('css属性名')";因为document.querySelectorAll得到的是一个数组,所以需要index指明你想得到数组里的第几个值。


    3.有的网页,一个页面会有多个Tab,点击对应的tab,会到指定的div。并且这些tab对应的每个div的class和结构都是一样的,通过xpath是得到一个List<WebElement>,而不是那个被激活div下我们需要的那个元素。这个时候其实被我们点击的那个tab的class一般都会有 active 显示,我们可以通过这个来区别其他tab下的内容。如果没有 active的话,就是开发的锅了。。。因为我遇到过这个坑,是带我的小姐姐教的,所以提及给自己一个提醒。其实自动化测试,一些Popup window 的出现和消失都是通过class来控制的,所以当出现某个东西比较难找的时候,点击该元素,注意观察浏览器F12下代码的变化就能看的出来了。

    4.现在网页的结构一般都会有个Header,Header中会有多个一级链接,每个一级链接下还会有多个链接,并且这些linkText基本都是一两个单词的那种,如果每个都用xpath去取的话就会很烦,所以呢,噔噔噔噔噔,就用一个封装的方法通过传入链接的text就可以了。

    String selectorFormat="//div[@class='selector-container']//div[@class='title-btn']//span[contains(text(),'%s')]";
    public WebElement linkTextOfSelector(String linkName) {
    return find(selectorFormat, linkName);
    }

    %s是通配符?我还没有了解透彻,代码大概是这样,我现在去查一下这个%s...——在Java中,这是一个字符串占位符


    展开全文
  • selenium3如何定位一组元素

    除了,前面我们熟知WebDriver有8种定位单个元素的方法,也提到了WebDriver 还提供了与之对应的 8 种定位方法用于定位一组元素。
    8种find_elements_by_*方法如下所示:

    • find_elements_by_id:通过元素的ID属性值来定位一组元素;
    • find_elements_by_name:通过元素的name属性值来定位一组元素;
    • find_elements_by_class_name:通过元素的class属性值来定位一组元素;
    • find_elements_by_xpath:通过Xpath来定位一组元素;
    • find_elements_by_tag_name:通过元素的tag name来定位一组元素;
    • find_elements_by_css_selector:通过CSS选择器来定位一组元素;
    • find_elements_by_link_text:通过元素标签对之间的文本信息来定位一组元素;
    • find_elements_by_partial_link_text:通过元素标签对之间的部分文本信息来定位一组元素。

    1. 通过tag name定位一组元素案例

    第5章介绍到,可通过tag name定位一组元素。通过html语言简单编写了checkbox.html文件。checkbox.html页面的html代码如下

    
    <html>
      <head>
            <title>复选框测试实例</title>
      </head>
      <body>
         请选择你喜爱的水果</br>
           <input type="checkbox" name="fruit" value ="apple" >苹果<br>
           <input type="checkbox" name="fruit" value ="orange">桔子<br>
           <input type="checkbox" name="fruit" value ="mango">芒果<br>   
      </body>
    </html>
    

    checkbox.html页面的展现效果如图所示。
    21.png
    checkbox.html页面效果

    通过checkbox.html页面的html代码可以看到3个复选框的标签都是标签。
    案例要求:
    设计Selenium程序,通过find_elements_by_tag_name()方法实现选中3种水果的复选框。
    代码如下:

    #方式1:通过find_elements_by_tag_name
    from selenium import webdriver
    from time import sleep
    
    driver = webdriver.Firefox()
    driver.get("file:///D:/checkbox.html")       #checkbox.html的路径要根据自己的实际情况调整
    
    inputs = driver.find_elements_by_tag_name("input")
    
    for i in inputs:
        # 通过看源代码,使用type或name均可,因为三种水果这3个元素,这2个属性均相同
        if i.get_attribute("type") == "checkbox":
        # if i.get_attribute("name") == "fruit":
            i.click()
            sleep(3)
    driver.quit()
    

    通过上面的代码,可以看到是通过find_elements_by_tag_name方法定位了所有标签为的元素。

    还可以通过find_elements_by_xpath()方法实现该案例要求的操做,代码如下:

    #方式2:通过find_elements_by_xpath
    from selenium import webdriver
    from time import sleep
    
    driver = webdriver.Firefox()
    driver.get("file:///D:/checkbox.html")
    
    checkboxes = driver.find_elements_by_xpath("//input[@name='fruit']")
    
    print(len(checkboxes))
    
    for checkbox in checkboxes:
        checkbox.click()
    driver.quit()
    

    2. 层级定位

    前面提到了层级等位,层级定位可能在如下情况发生时被应用到。
    如果被定为的元素,无法通过自身属性来唯一标识自己,此时可以考虑借助上级元素来定位自己。举生活中的例子,一个婴儿刚出生,还没有姓名与身份证号,此时给婴儿进行检查时往往会标注为“某某之女”。因为婴儿的母亲是确定的,找到母亲也就找到了婴儿。XPath的层级与属性结合定位就是如此。

    在定位一组元素中,往往也可以用到层级定位的方法。例如常见的表格、下拉选择框等。都可能用到层级定位。
    案例如图所示:

    • 通过层级的定位方式获得表格【广东】这个单元格的值;
    • 【籍贯】下拉中选择上海。
      22.png

    图案例效果图

    案例html源码。# 学习目标:

    <html>
    	<head>
    		<title>表格&下拉选择框</title>
    	</head>
    	<style>
    		.box{
    			width:500px;height:800px;
    			margin:20px auto;
    			text-align:center;		
    		}
    	</style>
    	<body>	
    		<table border="1" id="qw" align="center">
    			<tr>
    				<th>省份</th>
    				<th>城市</th>
    			</tr>
    			<tr>
    				<td>广东</td>
    				<td>浙江</td>
    			</tr>
    			<tr>
    				<td>广州</td>
    				<td>杭州</td>
    			</tr>
    		</table>
    		</br>
    		<div class="box">
    			<label>籍贯</label>
    				<select name="site">
    					<option value="0">北京</option>
    					<option value="1">上海</option>
    					<option value="2">深圳</option>
    				</select>	
    		</div>
    	</body>
    </html>
    

    通过层级定位方式,实现的代码如下:

    from selenium import webdriver
    driver=webdriver.Firefox()
    driver.get("file:///D:/ TableSelect.html")
    
    table=driver.find_element_by_id("qw")
    
    #获取行数
    row=table.find_elements_by_tag_name("tr")
    
    #获取列数
    col=row[0].find_elements_by_tag_name("th")
    
    #获取第一行第一列
    Row_Col=row[1].find_elements_by_tag_name("td")[0].text
    print(Row_Col)
    
    # 下拉框选择第2个值
    checkvalue=driver.find_element_by_name("site")
    checkvalue.find_element_by_xpath("//option[@value='1']").click()
    
    展开全文
  • web自动化测试第2步:定位元素

    千次阅读 2017-06-01 11:24:44
    上一节我们已经配置好了环境并且可以通过脚本打开浏览器了,说明我们已经打开了自动化测试的大门,接下来就开始学习如何定位页面元素 html页面是有一个个的标签组成的,我们定位元素其实就是定位这些标签 ...
  • 篇博客selenium+python自动化测试(二)–使用webdriver操作浏览器讲解了使用webdriver操作浏览器的各种方法,可以实现对浏览器进行操作了,接下来就是对浏览器页面元素进行操作,操作页面元素,首先要找到...
  • 定位个元素(百度) 实现网络上的代码''' import random from selenium import webdriver driver = webdriver.Chrome() driver.get('https://www.baidu.com') a = driver.find_element_by_id(...
  • WEB自动化测试中Xpath定位方法

    千次阅读 2018-03-16 16:21:44
    前言: Xpath是在XML文档查找信息的一种语言,使用路径表达式来选取XML文档的节点或节点集,由于XML与HTML...1.查看元素是否找到,如果有返回一个列表:$x('xpath路径")][text()="项目总数"]') 2.实现点击:...
  • 写在前面 公司要求招一名自动化测试,能力要求不高,1年左右自动化经验+部分性能经验即可,让我出一份题,我就百度+公司项目遇到的问题,出了一份,出题...1、使用什么测试框架做的上一个项目的自动化测试?说下怎么...
  • 自动化(二)元素定位1)如何元素定位二、元素定位方式1)id定位2)name定位3)class_name定位4)id、name、class_name的区别 元素定位 目标:掌握id、name、class_name、tag_name、link_text、partial_link_...
  • 软件测试面试题整理()之自动化测试题大合集

    千次阅读 多人点赞 2020-11-01 23:25:18
    一般一个页面写一个类文件,这个类文件包含该页面的元素定位和业务操作方法 为了我们测试用例写的简单,清晰,我们很多时候在页面对象会封装很多业务操作方法,测试脚本只需要调用相关方法就可以。 2如果页面元素...
  • 自动化测试面试题及答案大全(2)

    万次阅读 多人点赞 2019-04-18 09:40:05
    一个开源的web自动化测试的框架,支持多种编程语言,支持跨浏览器平台进行测试。 Selenium 1.0或Selenium RC Selenium 2.0或Selenium Webdriver Selenium 3.0 问题2:你如何从命令行启动Selenium RC? java -jar ...
  • 何为基本操作,即这些方法在WebElement接口类定义,通过实例的WebElement直接调用。 void click():单击目标元素。 void submit():提交当前form(表单)内容到远程服务器,注意是特定于表单元素而言的。...
  • 如果一个元素没有id 没有name那我们该怎么定位元素了,第一想到的就是用xpath了。 在网上copy了一段代码,就以这个做说明吧,xpath定位元素分相对路径和绝对路径,主要说明下相对路径的用法。示例代码如下: ...
  • 自动化测试面试题(

    千次阅读 2020-08-27 21:41:20
    NO.4 项目使用的自动化测试框架NO.5 对库的使用NO.6 如何设计高质量自动化脚本NO.7 如何在脚本组织测试用例,按什么模式设计NO.8 page object设置模式,是否需要在page里定位的方法加上断言NO.9 page object...
  • WEB自动化测试面试题及答案大全

    千次阅读 2020-07-11 14:20:32
    Selenium不支持桌面软件的自动化测试,Selenium是根据网页元素的属性才定位元素,而其他桌面软件自动化测试工具是根据桌面元素的位置来定位元素,当然现在也有根据桌面元素的属性来定位的。 2.Selenium是否支持用例...
  • 说明:该篇博客是博主一字码编写的,实属不易,请尊重原创,谢谢大家! 目录 丶叙述 二丶环境搭建 三丶项目实战PO模型的设计与封装 丶叙述 1.项目介绍 项目分为九部分:基础项目实战丶PageObject丶...
  • 测试开发笔记

    万次阅读 多人点赞 2019-11-14 17:11:58
    测试基础 7 什么是软件测试: 7 ★软件测试的目的、意义:(怎么做好软件测试) 7 3.软件生命周期: 7 第二章 测试过程 8 1.测试模型 8 H模型: 8 V模型 9 2.内部测试 10 3外部测试: 10 验收测试:(在系统...
  • Web自动化测试Selenium 学习笔记(

    万次阅读 多人点赞 2018-05-14 20:34:47
    1、Web自动化测试简介自动化基础:自动化用例编写、Selenium优势及原理、自动化环境搭建Selenium基础:常见8大元素定位(表格)、常见元素处理、下拉框元素处理、不同窗口切换、元素进阶、元素等待需求到框架 需求...
  • 移动端自动化测试实战(二)

    万次阅读 2019-09-21 12:08:34
    说明:该篇博客是博主一字码编写的,实属不易,请尊重原创,谢谢大家! 接着上篇博客继续往下写 :...3.APP元素定位操作API 4.APP元素信息操作API 5.A...
  • Selenium自动化测试-3.元素定位(2)

    千次阅读 2021-07-23 19:35:18
    在上篇:Selenium自动化测试-元素定位(1),我们分析了id,name, class, tag, link_text及partial_link_text 共6种定位方法,其中id、name最常用。 有时候我们发现网站并没有id、name等属性。那么,我们可以用更...
  • 超实用的自动化测试平台推荐

    万次阅读 2019-09-29 11:31:19
    平台就是种用来实现某种功能的体系,包括各种不同的元素、架构、流程、标准、机制和工具等。而软件测试平台是为客户打造的集高效率、低成本等特性于身的软件工作空间。它不仅可以大幅缩短软件产品的测试周期,还...
  • 自动化测试】开展自动化测试的过程

    千次阅读 热门讨论 2021-05-13 21:37:33
    文章目录1)自动化测试需求分析1.1 如何确定系统是否适合做自动化测试?周期较长:稳定系统:脚本可复用:*被测系统适合怎样的自动化测试?2)调研测试工具、测试框架2.1 框架的选择2.1.1 TestNG主要特点:TestNG的...
  • 软件测试面试题汇总

    万次阅读 多人点赞 2018-09-27 12:31:09
    转载自: ... 软件测试面试题汇总 测试技术面试题 ...........................................................................................................
  • 前端自动化测试

    千次阅读 2019-09-09 17:11:16
    目前开发大型应用,测试是一个非常重要的环节,但是大多数前端开发者对测试相关的知识是比较缺乏的。因为可能项目开发周期短根本没有机会写,所以你没有办法体会到前端自动化测试的重要性。 来说说为什么前端自动化...
  • webdriver 可以很方便的使用 find_element 方法来定位某个特定的对象,不过有时候我们却需要定位一组对象,WebElement 接口同样提供了定位一组元素的方法 find_elements。或者可以查看CSS代码找出代码间的相同属性,...
  • 持续集成实践之自动化测试

    千次阅读 2019-05-08 15:06:36
    软件测试 软件测试大概这么分类: 黑盒测试 VS 白盒测试,以及介于黑盒白盒之间的灰盒测试测试粒度可分为: unit test, functional test, integration test, system test, acceptance test 等 按测试目的可分为...
  • 篇文章《在接口自动化测试中,如何利用Pytest + JSON Schema 进行接口响应断言》,介绍了JSON Schema校验接口响应的数据结构的方法。在实际的测试工作,很多时候是需要对接口的响应数值进行校验的。这时候就...
  • 自动化测试面试题及答案大全(5)

    万次阅读 多人点赞 2019-04-20 09:17:45
    Selenium不支持桌面软件的自动化测试,Selenium是根据网页元素的属性才定位元素,而其他桌面软件自动化测试工具是根据桌面元素的位置来定位元素,当然现在也有根据桌面元素的属性来定位的。 2.Selenium是否支持用例...
  • Java面试题大全(2020版)

    万次阅读 多人点赞 2019-11-26 11:59:06
    发现网上很多Java面试题都没有答案,所以花了...、Java 基础 1. JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。 JRE:Java Runtime Environ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 56,287
精华内容 22,514
关键字:

自动化测试定位一组元素中最后一个