• Selenium 元素定位


    定位对象的目的一般有下面几种

    · 操作对象

    · 获得对象的属性,如获得测试对象的class属性,name属性等等

    · 获得对象的text

    · 获得对象的数量

     

    webdriver提供了一系列的对象定位方法,常用的有以下几种

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

    #########百度输入框的定位方式##########
    
    #通过id方式定位
    browser.find_element_by_id("kw").send_keys("selenium")
    
    #通过name方式定位
    browser.find_element_by_name("wd").send_keys("selenium")
    
    #通过tag name方式定位
    browser.find_element_by_tag_name("input").send_keys("selenium")
    
    #通过class name 方式定位
    browser.find_element_by_class_name("s_ipt").send_keys("selenium")
    
    #通过CSS方式定位
    browser.find_element_by_css_selector("#kw").send_keys("selenium")
    
    #通过xphan方式定位
    browser.find_element_by_xpath("//input[@id='kw']").send_keys("selenium")
    
    ############################################

    CSS(Cascading Style Sheets)是一种语言,它被用来描述HTMLXML文档的表现。CSS使用选择器来为页面元素绑定属性。这些选择器可以被selenium用作另外的定位策略。

    CSS的比较灵活可以选择控件的任意属性,上面的例子中:

    find_element_by_css_selector("#kw")

    通过find_element_by_css_selector( )函数,选择取百度输入框的id属性来定义

    也可以取name属性

    <a href="http://news.baidu.com" name="tj_news">新 闻</a>

    driver.find_element_by_css_selector("a[name="tj_news"]").click()

     

    可以取title属性

    <a onclick="queryTab(this);" mon="col=502&pn=0" title="web" href="http://www.baidu.com/">网页</a>

    driver.find_element_by_css_selector("a[title="web"]").click()

     

    也可以是取class属性:

    <a class="RecycleBin xz" href="javascript:void(0);">

     

    driver.find_element_by_css_selector("a.RecycleBin").click()



    最难理解的xpath:

    XPath是一种在XML文档中定位元素的语言。因为HTML可以看做XML的一种实现,所以selenium用户可是使用这种强大语言在web应用中定位元素。

    XPath扩展了上面id和name定位方式,提供了很多种可能性,比如定位页面上的第三个多选框。

    复制代码
    xpath:attributer (属性)
    
    driver.find_element_by_xpath("//input[@id='kw']").send_keys("selenium")
    
    #input标签下id =kw的元素
    
     
    
    xpath:idRelative (id相关性)
    
    driver.find_element_by_xpath("//div[@id='fm']/form/span/input").send_keys("selenium")
    
    #在/form/span/input 层级标签下有个div标签的id=fm的元素
    
    driver.find_element_by_xpath("//tr[@id='check']/td[2]").click() 
    
    # id为'check' 的tr ,定闪他里面的第2个td
    
     
    
    xpath:position (位置)
    
    driver.find_element_by_xpath("//input").send_keys("selenium") 
    
    driver.find_element_by_xpath("//tr[7]/td[2]").click()
    
    #第7个tr 里面的第2个td
    
     
    
    xpath: href (水平参考)
    
    driver.find_element_by_xpath("//a[contains(text(),'网页')]").click()
    
    #在a标签下有个文本(text)包含(contains)'网页' 的元素
    
     
    
    xpath:link
    
    driver.find_element_by_xpath("//a[@href='http://www.baidu.com/']").click()
    
    #有个叫a的标签,他有个链接href='http://www.baidu.com/ 的元素
    
    

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

    查找页面根元素://

    查找页面上所有的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]

    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']/input[@id='J_password'],这样肯定会报错的。
    

    有时候元素属性给的很少,不妨我们就用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(), ’退出’)]));

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


    link 定位


     

    有时候不是一个输入框也不是一个按钮,而是一个文字链接,我们可以通过link

    复制代码
    #coding=utf-8
    
    from selenium import webdriver
    import time
    
    browser = webdriver.Firefox()
    
    browser.get("http://www.baidu.com")
    time.sleep(2)
        
    browser.find_element_by_link_text("贴 吧").click()
    time.sleep(2)
    browser.quit()
    复制代码

    一般一个那页面上不会出现相同的文件链接,通过文字链接来定位也是一种简单有效的定位方式。

     

     

    Partial Link Text 定位


     

    通过部分链接定位,这个有时候也会用到,我还没有想到很好的用处。拿上面的例子,我可以只用链接的一部分文字进行匹配:

    browser.find_element_by_partial_link_text("").click()
    
    #通过find_element_by_partial_link_text() 函数,我只用了“贴”字,脚本一样找到了"贴 吧" 的链接

  • 相关阅读:
    no-useless-call (Rules) – Eslint 中文开发手册
    Java 8 Stream
    CSS3 ,checked 选择器
    MySQL 数据类型
    _Alignas (C keywords) – C 中文开发手册
    C 库函数 – modf()
    JavaScript E 属性
    SyntaxError.prototype (Errors) – JavaScript 中文开发手册
    swagger和openAPI: 上传文件
    Java中HashMap的putAll()方法: HashMap.putAll()
  • 原文地址:https://www.cnblogs.com/wuyepiaoxue/p/5661197.html
Copyright © 2020-2023  润新知