zoukankan      html  css  js  c++  java
  • WebDriver API元素定位

    元素的定位和操作是自动化测试的核心部分,其中操作又是建立在定位的基础上的。
    举例:一个对象就是一个人,我们可以通过身份证号、姓名或者他的住址找到这个人。那么web对象也是一样的,我们可以通过唯一区别于其它元素的属性来定位这个元素。

    元素识别

    一、利用Chrome浏览器开发者工具
    1)打开Chrome浏览器,按F12或依次点击菜单——更多工具——开发者工具
    2)切换到Elements页签,在Elements下点击左上方小箭头可以指定页面元素,查看对应代码

    二、利用火狐浏览器开发者工具
    1)打开火狐浏览器,按F12或点击菜单——web开发者——查看器
    2)进入到查看器页签,在查看器下点击左上方小箭头可以指定页面元素,查看对应代码

    基本元素定位API使用

    #通过id定位元素
    driver.find_element_by_id("id_value")
    
    #通过name定位元素
    driver.find_element_by_name("name_value")
    
    #通过class_name定位元素
    driver.find_element_by_class_name("class_name")
    
    #通过tag_name定位元素
    driver.find_element_by_tag_name("tag_name_value")
    #备注:tag_name是所有定位方式中最不靠谱的一种,因为在一个页面上相同tag_name的元素极容易出现
    
    #通过link定位
    driver.find_element_by_link_text("text_value")
    driver.find_element_by_partial_link_text("text_value")
    #当一个文字很长的链接时,我们可以只取其中的部分,只要取的部分可以唯一标识元素
    
    #通过xpath定位元素
    driver.find_element_by_xpath("xpath_syntax")
    
    #通过css定位元素
    driver.find_element_by_css_selector("css_syntax")
    

    示例

    from selenium import webdriver
    driver=webdriver.Chrome()
    driver.get("http://www.baidu.com")
    
    #通过id定位元素
    driver.find_element_by_id("kw").send_keys("海贼王")
    
    #通过name定位元素
    driver.find_element_by_name("wd").send_keys("海贼王")
    
    #通过class_name定位元素
    driver.find_element_by_class_name("s_ipt").send_keys("海贼王")
    
    #通过link定位
    driver.find_element_by_link_text("新闻").click()
    driver.find_element_by_partial_link_text("hao").click()
    

    XPATH

    XPATH是一门在XML文档中查找信息的语言,XPATH可用来在XML文档中对元素和属性进行遍历,主流的浏览器都支持XPATH,因为HTML页面在DOM中表示为XHTML文档。

    Xpath常用6种定位元素的方法

    • 绝对路径
    • 相对路径
    • 元素属性
    • 元素属性值
    • 元素索引
    • 元素文本

    通过绝对路径定位

    绝对路径的开头是一个斜线(/),从网页的根节点html开始,逐层去查找需要定位的元素。
    此方法缺点显而易见,当页面元素位置发生改变时,都需要修改,因此,并不推荐使用。

    举例:百度搜索框绝对路径定位

    driver.find_element_by_xpath('/html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input').send_keys("海贼王")
    #当同一层次有多个相同的元素时,使用下标区分,下标从1开始
    

    通过相对路径定位

    相对路径的开头是两个斜线(//),表示文件中所有符合模式的元素都会被选出来,即使是处于树中不同层级也会被选出来。

    举例:百度搜索框相对路径定位

    driver.find_element_by_xpath('//span[1]/input').send_keys("海贼王")
    driver.find_element_by_xpath('//form/span[1]/input').send_keys("海贼王")
    #以上都可以定位到百度搜索框,相对路径的长度和开始位置并不受限制,可以采用从后往前逐级定位的方式去定位
    

    使用元素属性定位

    元素属性定位要求属性能够定位到唯一一个元素,如果存在多个相同条件的标签,默认定位第一个。
    具体格式://标签名[@属性="属性值"]
    支持使用and和or关键字,多个属性一起定位元素。

    driver.find_element_by_xpath("//a[@name='tj_trnews']").click()
    driver.find_element_by_xpath("//a[@name='tj_trnews' and @class='mnav']").click()
    driver.find_element_by_xpath("//a[@name='tj_trnews' or @class='mnav']").click()
    

    Xpath支持通配符*号,通过属性定位还可以如下写法:

    driver.find_element_by_xpath("//*[@name='tj_trnews']").click()
    

    使用部分属性值匹配(也称为模糊方法定位)

    属性值如果太长或网页中的元素属性动态变化,可以使用此方法

    元素属性值开头包含内容:starts-with()

    driver.find_element_by_xpath("//a[starts-with(@name,'tj_trhao')]").click()
    

    元素属性值结尾包含内容:substring()

    driver.find_element_by_xpath("//a[substring(@name,6)='map']").click()
    

    元素属性值包含内容:contains()

    driver.find_element_by_xpath("//a[contains(@name,'hao')]").click()
    

    通过元素索引定位

    遇到同层级相同标签元素时,可以使用索引(下标)表示,索引的初始值为1

    举例:定位百度hao123链接

    driver.find_element_by_xpath('//div[3]/a[2]').click()
    driver.find_element_by_xpath('//div[@id='ul']/a[2]').click()
    

    使用元素文本定位

    元素文本在xpath中可以通过text()函数获取,也可以用其来进行元素定位。

    driver.find_element_by_xpath("//a[text()='新闻']").click()
    driver.find_element_by_xpath("//a[contains(text(),'新')]").click()
    

    Css_selector

    CSS是一个被用来描述如何在屏幕等处渲染HTML和XML文档的语言。
    CSS使用选择器来为文档中的元素绑定样式属性。
    选择器(selector)是用来在树中匹配元素的模式,选择器对HTML和XML进行了优化,被设计用来在注重性能的代码中执行。

    Css_selector常用6种定位元素的方法

    • 绝对路径
    • 相对路径
    • 元素属性
    • 元素属性值
    • 查询子元素
    • 查询兄弟元素

    通过绝对路径定位

    当同一层级有多个相同的元素时,使用id或class区分,遇到id用#号,遇到class用.号

    driver.find_element_by_css_selector("html body div div div div div form span input").send_keys("海贼王")
    
    driver.find_element_by_css_selector("html>body>div>div>div>div>div>form>span>input").send_keys("海贼王")
    

    通过id(#)或者class(.)定位

    可以和标签名组合使用。

    driver.find_element_by_css_selector("#kw").send_keys("海贼王")
    
    driver.find_element_by_css_selector(".s_ipt").send_keys("海贼王")
    
    driver.find_element_by_css_selector("input#kw").send_keys("海贼王")
    
    driver.find_element_by_css_selector("input.s_ipt").send_keys("海贼王")
    

    使用元素属性定位

    具体格式:标签名[属性="属性值"]
    支持使用多个属性一起定位元素。

    driver.find_element_by_css_selector("input[autocomplete='off']").send_keys("海贼王")
    
    driver.find_element_by_css_selector("input[autocomplete='off'][id='kw']").send_keys("海贼王")
    

    使用部分属性值匹配(也称为模糊方法定位)

    • 元素属性值开头包含内容:^=
    • 元素属性值结尾包含内容:$=
    • 元素属性值结尾包含内容:*=

    举例:

    driver.find_element_by_css_selector("input[autocomplete^='of']").send_keys("海贼王")
    
    driver.find_element_by_css_selector("input[autocomplete$='ff']").send_keys("海贼王")
    
    driver.find_element_by_css_selector("input[autocomplete*='of']").send_keys("海贼王")
    

    通过子元素定位(类似xpath中的索引的方法)

    • 子元素:A>B
    • 后代元素:A B(类似>)
    • 第一个后代元素:first-child
    • 最后一个后代元素:last-child
    • 第n个子元素:nth-child(N)[类同:nth-of-type(N)]

    示例:

    driver.find_element_by_css_selector("div#u1 a:first-child").click()
    
    driver.find_element_by_css_selector("div#u1 a:last-child").click()
    
    driver.find_element_by_css_selector("div#u1 a:nth-child(2)").click()
    

    查找兄弟元素

    1)同层级下一个元素:+
    2)选择同层级多个相同标签的元素:~

    备注:
    +号可以多次使用
    ~号一般返回的是多个元素,要用find_elements接收

    定位元素代码形式:

    from selenium.webdriver.common.by import By
    

    示例:

    driver.find_element_by_css_selector("div#u1 a +a +a").click()
    

    总结

    定位元素的方式有8种,写法有两种

    #driver.find_element_by_id()
    driver.find_element(By.ID,"")
    
    #driver.find_element_by_name()
    driver.find_element(By.NAME,"")
    
    #driver.find_element_by_class_name()
    driver.find_element(By.CLASS_NAME,"")
    
    #driver.find_element_by_tag_name()
    driver.find_element(By.TAG_NAME,"")
    
    #driver.find_element_by_partial_link_text()
    driver.find_element(By.LINK_TEXT,"")
    
    #driver.find_element_by_partial_link_text()
    driver.find_element(By.PARTIAL_LINK_TEXT,"")
    
    driver.find_element_by_xpath()
    driver.find_element(By.XPATH,"")
    
    driver.find_element_by_css_selector()
    driver.find_element(By.CSS_SELECTOR,"")
  • 相关阅读:
    学习Java书籍推荐和面试网站推荐
    Java 多线程学习扩展
    Java Excel 导入导出(二)
    Java Excel 导入导出(一)
    Matplotlib库(二)
    Matplotlib库(一)
    【转】MATLAB导出精美的论文插图
    图像的手绘效果
    Numpy库的使用(二)
    Numpy库的使用(一)
  • 原文地址:https://www.cnblogs.com/TD1900/p/11926935.html
Copyright © 2011-2022 走看看