精华内容
下载资源
问答
  • 这个元素,如果直接写入复合元素属性值,则会出现以下报错: Compound class names not permitted:不允许使用复合类名 但是可以直接写其中的一部分,就可以定位得到,如下图:(其中第一个有其他同名元素值)...

    如下的元素属性值

     

     

    放大:

     

    这个元素,如果直接写入复合元素属性值,则会出现以下报错:

     

    Compound class names not permitted:不允许使用复合类名

    但是可以直接写其中的一部分,就可以定位得到,如下图:(其中第一个有其他同名元素值)

     

     

    展开全文
  • 在使用selenium webdriver进行元素定位时,通常使用findElement或findElements方法结合By类返回的元素句柄来定位元素。其中By类的常用定位方式共八种,现分别介绍如下: 1. By.name() 假设我们要测试的页面源码如下...

    如果你只是想快速实现控件抓取,而不急于了解其原理,可直接看:

    http://blog.csdn.net/kaka1121/article/details/51878346

    如果你想学习web端自动化,或者更快速地完成更稳定的前端自动化,不妨尝试点击:

    Web自动化框架LazyUI使用手册(1)--框架简介


    在使用selenium webdriver进行元素定位时,通常使用findElement或findElements方法结合By类返回的元素句柄来定位元素。其中By类的常用定位方式共八种,现分别介绍如下:

    1. By.name()

    假设我们要测试的页面源码如下:

    <button id="gbqfba" aria-label="Google Search" name="btnK" class="gbqfba"><span id="gbqfsa">Google Search</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();
            }
    }

    2. 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();
    
            }
    
    }

    3. 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属性才能过滤出我们要的元素。

    4. By.className()

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

    .buttonStyle{
    
        width: 50px;
        height: 50px;
        border-radius: 50%;
        margin: 0% 2%;
    
    }

    定义好后,就可以在页面元素中引用上述定义好的样式,如下:

     <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伪类名作为它的样式属性值,此时就必须结合后面要介绍的cssSelector方法来定位了,稍后会有详细例子。


    5. 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();
        }
    }

    6. 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方法。


    7. By.xpath()

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

    假设我们现在以图(2)所示HTML代码为例,要引用对应的对象,XPath语法如下:


    绝对路径写法(只有一种),写法如下:

    引用页面上的form元素(即源码中的第3行):/html/body/form[1]

    注意:1. 元素的xpath绝对路径可通过firebug直接查询。2. 一般不推荐使用绝对路径的写法,因为一旦页面结构发生变化,该路径也随之失效,必须重新写。3. 绝对路径以单/号表示,而下面要讲的相对路径则以//表示,这个区别非常重要。另外需要多说一句的是,当xpath的路径以/开头时,表示让Xpath解析引擎从文档的根节点开始解析。当xpath路径以//开头时,则表示让xpath引擎从文档的任意符合的元素节点开始进行解析。而当/出现在xpath路径中时,则表示寻找父节点的直接子节点,当//出现在xpath路径中时,表示寻找父节点下任意符合条件的子节点,不管嵌套了多少层级(这些下面都有例子,大家可以参照来试验)。弄清这个原则,就可以理解其实xpath的路径可以绝对路径和相对路径混合在一起来进行表示,想怎么玩就怎么玩

     

    下面是相对路径的引用写法:

    查找页面根元素://

    查找页面上所有的input元素://input

    查找页面上第一个form元素内的直接子input元素(即只包括form元素的下一级input元素,使用绝对路径表示,单/号)://form[1]/input

    查找页面上第一个form元素内的所有子input元素(只要在form元素内的input都算,不管还嵌套了多少个其他标签,使用相对路径表示,双//号)://form[1]//input

    查找页面上第一个form元素://form[1]

    查找页面上id为loginForm的form元素://form[@id='loginForm']

    查找页面上具有name属性为username的input元素://input[@name='username']

    查找页面上id为loginForm的form元素下的第一个input元素://form[@id='loginForm']/input[1]

    查找页面具有name属性为contiune并且type属性为button的input元素://input[@name='continue'][@type='button']

    查找页面上id为loginForm的form元素下第4个input元素://form[@id='loginForm']/input[4]

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

     

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

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

    前面讲的都是xpath中基于准确元素属性的定位,其实xpath作为定位神器也可以用于模糊匹配。比如下面图(4)所示代码:


    这段代码中的“退出”这个超链接,没有标准id元素,只有一个rel和href,不是很好定位。不妨我们就用xpath的几种模糊匹配模式来定位它吧,主要有三种方式,举例如下

    a. 用contains关键字,定位代码如下:

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

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

    b. 用start-with,定位代码如下:

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

    这句的意思是寻找rel属性以nofo开头的a元素。其中@后面的rel可以替换成元素的任意其他属性。

    c. 用Text关键字,定位代码如下:

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

    这个方法可谓相当霸气啊。直接查找页面当中所有的退出二字,根本就不用知道它是个a元素了。这种方法也经常用于纯文字的查找。

    另外,如果知道超链接元素的文本内容,也可以用

    driver.findElement(By.xpath(“//a[contains(text(), ’退出’)]));

    这种方式一般用于知道超链接上显示的部分或全部文本信息时,可以使用。

     

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


    8. By.cssSelector()

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

    下面是一些常见的cssSelector的定位方式:

    定位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”]。

     

    明白基本语法后,我们来尝试用cssSelector方式来引用图(3)中选中的那个input对象,代码如下:

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

    同样必须注意层级关系,这个不能省略。

     

    cssSelector还有一个用处是定位使用了复合样式表的元素,之前在第4种方式className里面提到过。现在我们就来看看如何通过cssSelector来引用到第4种方式中提到的那个button。button代码如下:

    <button id="J_sidebar_login" class="btn btn_big btn_submit" type="submit">登录</button>


    cssSelector引用元素代码如下:

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

    。这样就可以顺利引用到使用了复合样式的元素了。

     

    此外,cssSelector还有一些高级用法,如果熟练后可以更加方便地帮助我们定位元素,如我们可以利用^用于匹配一个前缀,$用于匹配一个后缀,*用于匹配任意字符。例如:

    匹配一个有id属性,并且id属性是以”id_prefix_”开头的超链接元素:a[id^='id_prefix_']

    匹配一个有id属性,并且id属性是以”_id_sufix”结尾的超链接元素:a[id$='_id_sufix']

    匹配一个有id属性,并且id属性中包含”id_pattern”字符的超链接元素:a[id*='id_pattern']

     

    最后再总结一下,各种方式在选择的时候应该怎么选择:

    1. 当页面元素有id属性时,最好尽量用id来定位。但由于现实项目中很多程序员其实写的代码并不规范,会缺少很多标准属性,这时就只有选择其他定位方法。

    2. xpath很强悍,但定位性能不是很好,所以还是尽量少用。如果确实少数元素不好定位,可以选择xpath或cssSelector。

    3. 当要定位一组元素相同元素时,可以考虑用tagName或name。

    4. 当有链接需要定位时,可以考虑linkText或partialLinkText方式。


    展开全文
  • 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做元素定位的话,将导致你的脚本执行速度大大降低,所以请慎用。

    展开全文
  • 52:Xpath+class属性定位 利用elements索引来找>>> v = driver.find_elements(By.XPATH,"//*[@class='label-bihu tad-bihu-quote-source active']")>>> v[0].click() --------------------------...

    52:Xpath+class属性定位 利用elements索引来找
    >>> v = driver.find_elements(By.XPATH,"//*[@class='label-bihu tad-bihu-quote-source active']")
    >>> v[0].click()

    --------------------------------------------------------------------------------

    53:css+某一项属性定位
    >>> aa = driver.find_element_by_css_selector('[data-source="4"]')
    >>> aa.click()
    实例:


    --------------------------------------------------------------------------------

    54:elements定位有汉字的值,text


    --------------------------------------------------------------------------------
    https://blog.csdn.net/wushuai150831/article/details/78617729 网页里面可以看下面的详细
    55:By.name()

    searchBox = driver.findElement(By.name("btnK"));
    searchBox.click();

    --------------------------------------------------------------------------------

    56:By.id()


    --------------------------------------------------------------------------------

    57:By.tagName()


    多个input框属性想通定位方法


    --------------------------------------------------------------------------------

    58:By.classname()


    --------------------------------------------------------------------------------

    59:By.linktet()


    --------------------------------------------------------------------------------

    60:By.partialLinkText()


    --------------------------------------------------------------------------------

    61:By.xpath()

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


    图(2)
    绝对路径写法(只有一种),写法如下:
    引用页面上的form元素(即源码中的第3行):/html/body/form[1]
    注意:1. 元素的xpath绝对路径可通过firebug直接查询。2. 一般不推荐使用绝对路径的写法,因为一旦页面结构发生变化,该路径也随之失效,必须重新写。3. 绝对路径以单/号表示,而下面要讲的相对路径则以//表示,这个区别非常重要。另外需要多说一句的是,当xpath的路径以/开头时,表示让Xpath解析引擎从文档的根节点开始解析。当xpath路径以//开头时,则表示让xpath引擎从文档的任意符合的元素节点开始进行解析。而当/出现在xpath路径中时,则表示寻找父节点的直接子节点,当//出现在xpath路径中时,表示寻找父节点下任意符合条件的子节点,不管嵌套了多少层级(这些下面都有例子,大家可以参照来试验)。弄清这个原则,就可以理解其实xpath的路径可以绝对路径和相对路径混合在一起来进行表示,想怎么玩就怎么玩。

    下面是相对路径的引用写法:
    查找页面根元素://
    查找页面上所有的input元素://input
    查找页面上第一个form元素内的直接子input元素(即只包括form元素的下一级input元素,使用绝对路径表示,单/号)://form[1]/input
    查找页面上第一个form元素内的所有子input元素(只要在form元素内的input都算,不管还嵌套了多少个其他标签,使用相对路径表示,双//号)://form[1]//input
    查找页面上第一个form元素://form[1]
    查找页面上id为loginForm的form元素://form[@id='loginForm']
    查找页面上具有name属性为username的input元素://input[@name='username']
    查找页面上id为loginForm的form元素下的第一个input元素://form[@id='loginForm']/input[1]
    查找页面具有name属性为contiune并且type属性为button的input元素://input[@name='continue'][@type='button']
    查找页面上id为loginForm的form元素下第4个input元素://form[@id='loginForm']/input[4]
    Xpath功能很强大,所以也可以写得更加复杂一些,如下面图(3)的HTML源码。


    图(3)
    如果我们现在要引用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元素。后面的路径必须按照源码的层级依次往下写。按照图(3)所示代码中,我们要找的input元素包含在一个dt标签内,而dt又包含在dl标签内,所以中间必须写上dl和dt两层,才到input这层。当然我们也可以用*号省略具体的标签名称,但元素的层级关系必须体现出来,比如我们不能写成//*[@id='J_login_form']/input[@id='J_password'],这样肯定会报错的。

    前面讲的都是xpath中基于准确元素属性的定位,其实xpath作为定位神器也可以用于模糊匹配。比如下面图(4)所示代码:


    图(4)
    这段代码中的“退出”这个超链接,没有标准id元素,只有一个rel和href,不是很好定位。不妨我们就用xpath的几种模糊匹配模式来定位它吧,主要有三种方式,举例如下。
    a. 用contains关键字,定位代码如下:
    1 driver.findElement(By.xpath(“//a[contains(@href, ‘logout’)]”));
    这句话的意思是寻找页面中href属性值包含有logout这个单词的所有a元素,由于这个退出按钮的href属性里肯定会包含logout,所以这种方式是可行的,也会经常用到。其中@后面可以跟该元素任意的属性名。
    b. 用start-with,定位代码如下:
    1 driver.findElement(By.xpath(“//a[starts-with(@rel, ‘nofo’)]));
    这句的意思是寻找rel属性以nofo开头的a元素。其中@后面的rel可以替换成元素的任意其他属性。
    c. 用Text关键字,定位代码如下:
    1 driver.findElement(By.xpath(“//*[text()=’退出’]));
    这个方法可谓相当霸气啊。直接查找页面当中所有的退出二字,根本就不用知道它是个a元素了。这种方法也经常用于纯文字的查找。
    另外,如果知道超链接元素的文本内容,也可以用
    1 driver.findElement(By.xpath(“//a[contains(text(), ’退出’)]));
    这种方式一般用于知道超链接上显示的部分或全部文本信息时,可以使用。

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

    8. By.cssSelector()
    cssSelector这种元素定位方式跟xpath比较类似,但执行速度较快,而且各种浏览器对它的支持都相当到位,所以功能也是蛮强大的。
    下面是一些常见的cssSelector的定位方式:
    定位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”]。

    明白基本语法后,我们来尝试用cssSelector方式来引用图(3)中选中的那个input对象,代码如下:
    WebElement password = driver.findElement(By.cssSelector("#J_login_form>dl>dt>input[id=’ J_password’]"));
    同样必须注意层级关系,这个不能省略。

    cssSelector还有一个用处是定位使用了复合样式表的元素,之前在第4种方式className里面提到过。现在我们就来看看如何通过cssSelector来引用到第4种方式中提到的那个button。button代码如下:
    <button id="J_sidebar_login" class="btn btn_big btn_submit" type="submit">登录</button>
    cssSelector引用元素代码如下:
    driver.findElement(By.cssSelector("button.btn.btn_big.btn_submit"))
    。这样就可以顺利引用到使用了复合样式的元素了。

    此外,cssSelector还有一些高级用法,如果熟练后可以更加方便地帮助我们定位元素,如我们可以利用^用于匹配一个前缀,$用于匹配一个后缀,*用于匹配任意字符。例如:
    匹配一个有id属性,并且id属性是以”id_prefix_”开头的超链接元素:a[id^='id_prefix_']
    匹配一个有id属性,并且id属性是以”_id_sufix”结尾的超链接元素:a[id$='_id_sufix']
    匹配一个有id属性,并且id属性中包含”id_pattern”字符的超链接元素:a[id*='id_pattern']

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

    参考资料:
    《Selenium Webdriver Practical Guide》
    https://saucelabs.com/resources/selenium/css-selectors

    --------------------------------------------------------------------------------

    62:获取class的text

    转载于:https://www.cnblogs.com/wyj497022944/p/9627095.html

    展开全文
  • C语言

    万次阅读 多人点赞 2019-12-18 23:01:50
    行号是用来定位代码的,指文件在几行) 50.C语言的每个语句的最后必须有一个分号 51.C语言本身没有输入输出语句(没有特定的输入输出语句) 52.C语言可用来编写应用软件,也可用来编写系软件 53.TurboC是在微机上...
  • CSS复合属性参考手册 复合属性基本概念 我们知道 border 属性可以同时规定边框的粗细、颜色、和边框类型。例如: border:2px solid blue; 所谓的复合属性就是类型 border 这样的属性,能够一个属性规定对象的多...
  • 前端面试题

    万次阅读 多人点赞 2019-08-08 11:49:01
    CSS中可以通过哪些属性定义,使得一个DOM元素不显示在浏览器可视范围内? 29 超链接访问过后hover样式就不出现的问题是什么?如何解决? 29 什么是Css Hack?ie6,7,8的hack分别是什么? 30 行内元素和块级元素...
  • CSS样式选择器与常用的复合属性的设置
  • 元素定位方式

    2018-08-17 13:27:07
     使用元素名+属性定位://*[@name='phone'] 获取手机号输入框  使用元素名+包含部分属性值://*[contains(@name,'one')] 获取手机输入框  使用元素名+文本的内容://*[text()='免费注册']    要注意...
  • 自动化测试之元素定位

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

    万次阅读 多人点赞 2019-11-14 17:11:58
    子模块 接口 灰盒测试 验证模块、子模块、接口是否符合 概要设计说明书 能够帮助更准确的 定位缺陷的所在,从而降低了定位缺陷的成本 定位准确快速 1接口测试有技术要求,技术实现难度大 2接口太多,数量庞大,做...
  • 在使用selenium webdriver进行元素定位时,通常使用findElement或findElements方法结合By类返回的元素句柄来定位元素。其中By类的常用定位方式共八种,现分别介绍如下。 1. By.name() 假设我们要测试的页面源码...
  • Selenium Java(2)元素定位

    万次阅读 2019-05-14 09:43:14
    策略 语法 语法 描述 By id driver.findElement(By.id()) ...通过id属性定位元素 By name driver.findElement(By.name()) driver.findElements(By.name()) 通过name属性定位元素 By class name driver...
  • Web 页面常用元素定位

    千次阅读 2018-05-22 21:17:08
    //为元素名字1、id: WebElement的id属性&lt;input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off"&gt;$...
  • C#基础教程-c#实例教程,适合初学者

    万次阅读 多人点赞 2016-08-22 11:13:24
    C#中抛弃了C和C++中繁杂且极易出错的操作符象::和->等,C#中的复合名字一律通过.来连接。System是.Net平台框架提供的最基本的名字空间之一,有关名字空间的详细使用方法将在以后详细介绍,这里只要学会怎样导入名字...
  • 环境:python + selenium...用find_element_by_class_name在定位有多空格的复合类是会报错找不到。Compound class names not permitted. selected_div = driver.find_element_by_class_name('next-pagination nex...
  • Selenium Webdriver元素定位的八种常用方式     在使用selenium webdriver进行元素定位时,通常使用findElement或findElements方法结合By类返回的元素句柄来定位元素。其中By类的常用定位方式共八种,现分别...
  • 元素、内联元素、内联块元素 元素就是标签,布局中常用的有三种标签,块元素、内联元素、内联块元素,了解这三种元素的特性,才能熟练的进行页面布局。 块元素元素,也可以称为行元素,布局中常用的标签如:...
  • python Selenium 元素定位

    千次阅读 2018-06-30 12:43:05
    Selenium常用的定位元素的方式id find_element_by_id()namefind_elemnent_by_name()class namefind_element_by_class_name()tag namefind_element_by_tag_name()link textfind_element_by_link_text()partial link ...
  • 有两种路径: 绝对路径:从HTML根路径下一层一层往下数,找到对应的层级,从而定位 相对路径:基于匹配制度来查找元素 ...基于文本来定位元素 A[test()=”文本内容”]来进行查找 如果文本内容是value值用input[@valu
  • selenium 元素定位

    2020-07-09 14:22:13
    一、基本元素定位 1、id定位 chromeDriver.findElement(By.id(“kw”)).sendKeys(“测试”); 2、name定位 chromeDriver.findElement(By.name(“wd”)).sendKeys(“测试”); 3、tagName 找到的元素是多个,不推荐
  • 在使用selenium webdriver进行元素定位时,通常使用findElement或findElements方法结合By类返回的元素句柄来定位元素。其中By类的常用定位方式共八种,现分别介绍如下。 1. By.name() 假设我们要测试的页面源码如下...
  • 1 background(复合属性)与font(复合属性): background: 颜色 图片的链接 是否平铺 背景位置 是否滚动。(可以随意调动或省略) Font: 粗度 字体风格 字体大小/行高 字体样式 字体大小和样式不可省略 ...
  • 目录元素定位-xpathxpath元素定位示例 元素定位-xpath xpath其实就是一个path(路径),一个描述页面元素位置信息的路径,相当于元素的坐标 xpath基于XML文档树状结构,是XML路径语言,用来查询XML文档中的节点 ...
  • WPF开发教程

    万次阅读 多人点赞 2019-07-02 23:13:20
    ------WPF开发教程 目录 WPF基础入门.......3. WPF基础之基元素... 23 4. WPF基础之属性系统... 26 5. WPF基础之路由事件... 33 6. WPF基础之布局系统... 46 7. WPF基础之样式设置和模板化... ...
  • selenium 常用的八种定位元素的方法

    千次阅读 2019-10-16 23:34:37
    转载 Selenium Webdriver元素定位的八种常用方式 ...
  • 我们可以使用 css 的 position 属性来设置元素定位类型, postion 的设置项如下: relative 生成相对定位元素元素所占据的文档流的位置不变, 元素本身相对文档流的位置进行偏移。 absolute 生成绝对定位元素,...
  • ui自动化-selenium-定位元素方法 1.根据id属性进行定位,此id的值在同一个页面是唯一:driver.find_element_by_id() 2.根据class进行定位,class的值同一个页面是唯一:driver.find_element_by_class_name() ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,347
精华内容 6,138
关键字:

复合元素属性定位