• Selenium 元素定位


    元素定位

    元素的定位应该是自动化测试的核心,要想操作一个元素,首先应该识别这个元素象。

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

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

    id与name 定位

    案例:打开百度首页,在搜索框自动输入“python”关键词,然后点击搜索按钮,查看搜索页面。

    from  selenium import webdriver
    from time import sleep
    
    driver=webdriver.Chrome()
    driver.get("http://www.baidu.com")
    #根据id=kw定位元素,并输入python
    driver.find_element_by_id("kw").send_keys("python")
    sleep(1)
    #清除输入框内容
    driver.find_element_by_id("kw").clear()
    sleep(1)
    #根据name=kw定位元素,并输入python
    driver.find_element_by_name("wd").send_keys("python")
    
    sleep(2)
    #根据id=su定位元素,并点击
    driver.find_element_by_id("su").click()
    
    sleep(3)
    driver.quit()

    tag_name定位

    案例:打开我要自学网页面,在用户名输入框输入用户名“selenium”

    from  selenium import webdriver
    from  time import sleep
    
    driver=webdriver.Chrome()
    
    driver.get("http://www.51zxw.com")
    
    #定位标签名为input的元素
    driver.find_element_by_tag_name("input").send_keys("selenium")
    
    #获取页面所有标签名称为“input”的标签。
    driver.find_elements_by_tag_name("input")[0].send_keys("selenium")
    
    sleep(3)
    
    driver.quit()

    class_name定位

    案例:根据标签中属性class来进行定位的一种方法,打开百度

    from  selenium import webdriver
    from  time import sleep
    
    driver=webdriver.Chrome()
    
    driver.get("http://www.baidu.com")
    
    driver.find_element_by_class_name("s_ipt").send_keys("Selenium 我要自学网")
    sleep(2)
    
    driver.find_element_by_id("su").click()
    sleep(3)
    
    driver.quit()

    案例:link_text定位就是根据链接文字进行定位

    from selenium import webdriver
    from time import sleep
    #1. link_text 和  partial_link_text区别
    #link_text 是超链接载体的精确匹配,而partial_link_text是对超链接载体的模糊匹配
    #2. 使用时这个超链接载体必须是唯一的。
    #3. 在网页上可通过Ctrl+F来查找关键字查看链接载体是否唯一
    
    driver=webdriver.Chrome()
    
    driver.get("http://www.52zxw.net/")
    ###
    #精确匹配超链接载体
    driver.find_element_by_link_text('程序设计').click()
    sleep(3)
    #模糊匹配超链接载体
    driver.find_element_by_partial_link_text('自动化测试').click()
    sleep(3)
    driver.quit()

    XPath定位

    XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。

    from selenium import webdriver
    from time import sleep
    
    driver=webdriver.Chrome()
    
    driver.get("http://www.baidu.com")
    
    # 绝对路径定位
    driver.find_element_by_xpath("/html/body/div[2]/div[1]/div/div[1]/div/form/span[1]/input").send_keys("51zxw")
    
    # 利用元素熟悉定位--定位到input标签中为kw的元素
    driver.find_element_by_xpath("//input[@id='kw']").send_keys("Selenium")
    
    # 定位input标签中name属性为wd的元素
    driver.find_element_by_xpath("//input[@name='wd']").send_keys("Selenium")
    
    # 定位所有标签元素中,class属性为s_ipt的元素
    driver.find_element_by_xpath("//*[@class='s_ipt']").send_keys("Python3")
    
    driver.find_element_by_id('su').click()
    
    sleep(3)
    driver.quit()

    xpath组合与逻辑定位

    from selenium import webdriver
    from time import sleep

    driver=webdriver.Chrome()

    driver.get("https://www.52zxw.net/login")
    #层级和属性结合定位--自学网首页输入用户和名密码
    driver.find_element_by_xpath("//form[@id='loginFrom']/div/div[2]/input").send_keys("51zxw")
    driver.find_element_by_xpath("//form[@id='loginFrom']/div/div[4]/input[2]").send_keys("66666")

    #逻辑运算组合定位
    driver.find_element_by_xpath("//input[@type='text' and @name='loginStr']").send_keys("51test")

    sleep(3)
    driver.quit()

    css定位

    Selenium极力推荐使用CSS 定位,而不是XPath来定位元素,原因是CSS 定位比XPath 定速度快,特别是在IE浏览器环境

    前端开发人员就是用CSS Selector设置页面上每一个元素的样式,无论那个元素的位置有多复杂,他们能定位到,那我们使用CSS Selector肯定也能非常精准的定位到页面Elements。

    CSS常用定位方法

    1. #id id选择器根据id属性来定位元素
    2. .class class选择器,根据class属性来定位元素
    3. [attribute=’value’] 根据属性来定位元素
    4. element.Attribute>element 根据元素层级来定位 父元素>子元素
    from selenium import webdriver
    from time import sleep
    
    driver=webdriver.Chrome()
    driver.get("http://www.baidu.com")
    
    #根据id来定位
    driver.find_element_by_css_selector('#kw').send_keys("Selenium 我要自学网")
    
    #根据class定位
    driver.find_element_by_css_selector('.s_ipt').send_keys('python')
    
    #通过属性来定位
    driver.find_element_by_css_selector("[autocomplete='off']").send_keys("selenium")
    
    sleep(2)
    driver.find_element_by_id('su').click()
    
    driver.get("http://www.52zxw.net/login")
    #通过元素层级来定位
    driver.find_element_by_css_selector("form#loginFrom>div>div>input").send_keys("51zxw")
    
    sleep(2)
    driver.quit()

    下拉菜单元素定位

    案例:下拉元素定位

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>下拉框练习</title>
    </head>
    <body>
    <select name="辛弃疾" id="">
        <option value="01">破阵子·为陈同甫赋壮词以寄之</option>
        <option value="02">醉里挑灯看剑,梦回吹角连营。</option>
        <option value="03">八百里分麾下炙,五十弦翻塞外声。沙场秋点兵。</option>
        <option value="04">马作的卢飞快,弓如霹雳弦惊。</option>
        <option value="05">了却君王天下事,赢得生前身后名。</option>
        <option value="06">可怜白发生!</option>
    </select>
    </body>
    </html>

    1.根据选项元素标签定位

    from selenium import webdriver
    from  time import sleep
    
    driver=webdriver.Chrome()
    
    driver.get("file:///D:/Users/xxxx/Desktop/test.html")
    sleep(2)
    
    #根据option标签来定位
    driver.find_elements_by_tag_name('option')[1].click()
    driver.find_element_by_css_selector("[value='02']").click()
    
    sleep(2)
    driver.quit()

    2.使用Select类定位

    from selenium import webdriver
    from time import sleep
    from selenium.webdriver.support.ui import Select

    driver=webdriver.Chrome()

    driver.get("file:///D:/Users/xxxx/Desktop/test.html")
    sleep(2)

    #利用Select类来进行定位
    select = Select(driver.find_element_by_css_selector("[name='辛弃疾']"))

    select.select_by_index(2)
    sleep(2)
    select.select_by_visible_text("了却君王天下事,赢得生前身后名。")
    sleep(2)
    select.select_by_value("06")

    sleep(2)
    driver.quit()

    By 元素定位

    • find_element(By.ID,”loginName”)
    • find_element(By.NAME,”SubjectName”)
    • find_element(By.CLASS_NAME,”u-btn-levred”)
    • find_element(By.TAG_NAME,”input”)
    • find_element(By.LINK_TEXT,”退出”)
    • find_element(By.PARTIAL_LINK_TEXT,”退”)
    • find_element(By.XPATH,”.//*[@id=’Title”)
    • find_element(By.CSS_SELECTOR,”[type=submit]”)
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from  time import sleep
    
    driver=webdriver.Chrome()
    driver.get("http://www.baidu.com/")
    driver.implicitly_wait(5)
    
    driver.find_element(By.ID,'kw').clear()
    driver.find_element(By.NAME,'wd').send_keys("Python ")
    driver.find_element(By.CLASS_NAME,'s_ipt').send_keys("自动化测试")
    driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("UI自动化测试")
    sleep(3)
    
    driver.find_element(By.ID,'su').click()
    sleep(3)
    driver.quit()

    元素操作方法

    • text 返回元素内容
    • clear()清除元素内容
    • send_keys() 传送元素值
    • click() 点击操作
    • submit()提交操作
    • get_attribute()获取元素的属性
    from selenium import webdriver
    
    driver=webdriver.Chrome()
    driver.get("http://www.baidu.com")
    #注意调用的text没有()号,元素属性
    text_ban=driver.find_element_by_id("s-usersetting-top").text
    print(text_ban)
    
    driver.find_element_by_id("kw").clear()
    driver.find_element_by_id("kw").send_keys("python")
    
    print("点击百度一下》》")
    #driver.find_element_by_id("su").click()        #click 和submit是一样的
    driver.find_element_by_id("su").submit()
    
    size=driver.find_element_by_id("kw").size
    print("搜索框尺寸为:%r" %size)
    
    attribute=driver.find_element_by_id("kw").get_attribute('type')
    print("输入框的属性为:%s" %attribute)

    复选框定位

    tag获取页面中所有的标签为input的元素 elements 多了一个“s” 这样可以获取一组元素

    在实际项目过程中,会经常遇到页面的各自复选框,那么使用selenium该如何操作这些选项框呢?

    <html>
    <head>
    <title>
    </title>    
    </head>
    <body>    
        <p><input type="checkbox" name="category" value="今日话题" />今日话题 </p>   
        <p><input type="checkbox" name="category" value="视觉焦点" />视觉焦点</p>
        <p><input type="checkbox" name="category" value="财经" />财经</p>    
        <p><input type="checkbox" name="category" value="汽车" />汽车</p>       
        <p><input id="btnOperate" type="button" value="选择" onclick="static_num()" /></p>
    </body>
    </html>
    from selenium import webdriver
    from time import sleep
    
    driver=webdriver.Chrome()
    driver.get("file:///D:/Users/huanghuiyou/Desktop/test2.html")
    
    inputs=driver.find_elements_by_tag_name("input")
    print("复选框的个数为")
    print(len(inputs))
    #inputs=driver.find_elements_by_xpath("//input[@type='checkbox']") #xpath获取元素
    #inputs=driver.find_elements_by_css_selector("input[type=checkbox]") #通过css来定位
    for i in inputs:
        if i.get_attribute("type")=="checkbox": #获取元素属性为checkbox
            i.click()                            #勾选方框
            sleep(1)
    #去掉最后一个选修的勾
    driver.find_elements_by_xpath("//input[@type='checkbox']").pop(-1).click()
    #pop(-1)获取最后一个,pop(0)获取第一个
  • 相关阅读:
    Delphi以及三方控件的源代码规模
    InitInheritedComponent的执行过程
    poj 3897 Maze Stretching 二分+A*搜索
    一些窗口API函数,比如SetForegroundWindow,SwitchToThisWindow
    终于懂了:WM_PAINT 与 WM_ERASEBKGND(三种情况:用户操作,UpdateWindow,InvalidateRect产生的效果并不相同),并且用Delphi代码验证 good
    窗口绘制有关的消息整理 WM_PAINT, WM_NCPAINT, WM_ERASEBKGND
    WM_PAINT与WM_ERASEBKGND(用户操作和API这两种情况产生消息的顺序有所不同)
    关于WM_ERASEBKGND和WM_PAINT的深刻理解
    offsetHeight在OnLoad中为0的现象
    TWinControl.WMNCPaint对非客户的绘制
  • 原文地址:https://www.cnblogs.com/watery/p/13865983.html
Copyright © 2020-2023  润新知