美文网首页
2021-04-08 Selenium元素定位实战

2021-04-08 Selenium元素定位实战

作者: hcc_9bf4 | 来源:发表于2021-04-08 11:22 被阅读0次
    1. 认识Selenium

    Selenium 是一个用于Web 应用程序的自动化测试工具。Selenium 直接运行在浏览器中,它可以模拟用户的行为操作,操作界面友好。Selenium 支持 IE、Google Chrome、Firefox、Opera等主流浏览器,同时Selenium也支持主流开发语言,如 Java、Python、C#等

    1. Selenium结合浏览器实战

    针对不同的浏览器,需要下载不同的驱动程序(Driver)。以Firefox 浏览器为例(需要先下载最新火狐浏览器),在https://github.com/mozilla/geckodriver/releases/网站中选择“geckodriver-v0.29.0-win64.zip(目前为止最新)”下载并解压文件后,把Geckodriver.exe文件放在Python安装程序的目录下,也就是E:\Python3(根据自己配置的python环境放在python.exe的当前路径下,当然也可以自己建一个文件夹,不过要添加环境变量,python.exe已经默认了环境变量)。针对Firefox浏览器的测试代码如下:运行后如果不报错,那么就成功了

    from selenium import webdriver
    url="https://www.baidu.com/"
    driver=webdriver.Firefox()
    driver.get(url=url)
    driver.quit()
    
    1. 元素定位实战

    在UI自动化测试中,最基础最核心的技能是对页面元素进行定位,定位到相应的元素后才可以对页面的操作进行编码验证。

    1. 单个元素定位实战

    在Selenium自动化测试中,提供了单个元素定位方式和多个元素定位方式。两种方式都是根据元素属性 ID、NAME、CLASS_NAME、TAG_NAME、CSS_SELECTOR、XPATH、LINK_TEXT、PARTIAL_LINK_TEXT 来进行定位。下面就通过具体的实例说明单个元素定位在UI自动化测试中的应用。

    3.1 find_element_by_id
    如图,谷歌浏览器按F12开发者模式选中输入框


    image.png
    from selenium import webdriver
    import time
    url="https://www.baidu.com/"
    driver=webdriver.Firefox()
    driver.maximize_window()
    driver.implicitly_wait(30)
    driver.get(url=url)
    driver.find_element_by_id('kw').send_keys('selenium') #自动在百度输入框中输入'selenium',用by_id方式定位
    time.sleep(5)
    driver.quit()
    

    以上可以精准找到百度input输入框,可以自行运行试看

    3.2 find_element_by_name

    from selenium import webdriver
    import time
    url="https://www.baidu.com/"
    driver=webdriver.Firefox()
    driver.maximize_window()
    driver.implicitly_wait(30)
    driver.get(url=url)
    driver.find_element_by_name('wd').send_keys('selenium') #自动在百度输入框中输入'selenium',用by_name方式定位
    time.sleep(5)
    driver.quit()
    

    以上也可以精准找到百度input输入框,可以自行运行试看

    3.3 .find_element_by_class_name

    from selenium import webdriver
    import time
    url="https://www.baidu.com/"
    driver=webdriver.Firefox()
    driver.maximize_window()
    driver.implicitly_wait(30)
    driver.get(url=url)
    driver.find_element_by_class_name('s_ipt').send_keys('selenium') #自动在百度输入框中输入'selenium',用by_class_name方式定位
    time.sleep(5)
    driver.quit()
    

    以上也可以精准找到百度input输入框,可以自行运行试看

    3.4 find_element_by_xpath
    获取的方式是定位到百度搜索输入框的元素属性后,用鼠标右键点击该属性,在弹出的快捷菜单中上选择“Copy”选项,在“Copy”子选项中选择“Copy Xpath”选项,如图所示。


    image.png
    from selenium import webdriver
    import time
    url="https://www.baidu.com/"
    driver=webdriver.Firefox()
    driver.maximize_window()
    driver.implicitly_wait(30)
    driver.get(url=url)
    driver.find_element_by_xpath("//*[@id='kw']").send_keys('selenium')#自动在百度输入框中输入'selenium',用xpath方式定位
    time.sleep(5)
    driver.quit()
    

    以上也可以精准找到百度input输入框,可以自行运行试看

    3.5 find_element_by_link_text

    LINK_TEXT用于对超链接的处理。在HTML的代码中主要是以标签a对应,方法是find_element_by_link_text。以点击百度首页的“新闻”链接为例,查看“新闻”对应的代码:<a href="http://news.baidu.com" name="tj_trnews"class="mnav">新闻</a>。依据代码可以看到它是以 a 标签的。下面实现点击百度首页的“新闻”链接,实现的代码如下:

    from selenium import webdriver
    import time
    url="https://www.baidu.com/"
    driver=webdriver.Firefox()
    driver.maximize_window()
    driver.implicitly_wait(30)
    driver.get(url=url)
    driver.find_element_by_link_text(u"新闻").click()#自动点击百度新闻超链接
    time.sleep(5)
    driver.quit()
    

    3.6 find_element_by_partial_link_text

    PARTIAL_LINK_TEXT 也用于对超链接的处理,它与 LINK_TEXT 不同的是,它是按模糊搜索方式处理的。例如,在百度首页包含“闻”字的只有新闻链接,那么操作的时候只需要填写“闻”字就可以定位成功,方法是find_element_by_partial_link_text。仍以实现点击百度首页的“新闻”链接为例,代码如下:

    from selenium import webdriver
    import time
    url="https://www.baidu.com/"
    driver=webdriver.Firefox()
    driver.maximize_window()
    driver.implicitly_wait(30)
    driver.get(url=url)
    driver.find_element_by_partial_link_text(u'闻').click() #自动模糊匹配点击百度新闻超链接
    time.sleep(5)
    driver.quit()
    

    3.7 find_element_by_css_selector
    当使用ID、NAME等方式定位不到元素的时候,可使用CSS_SELECTOR,方法是find_element_by_css_selector
    使用方式如find_element_by_xpath

    from selenium import webdriver
    import time
    url="https://www.baidu.com/"
    driver=webdriver.Firefox()
    driver.maximize_window()
    driver.implicitly_wait(30)
    driver.get(url=url)
    driver.find_element_by_css_selector('#kw').send_keys('selenium')#自动在百度输入框中输入'selenium',用by_css方式定位
    time.sleep(5)
    driver.quit()
    
    1. 多个元素定位实战

    在工作中,某些时候可能会发现元素的ID、NAME、CLASS_NAME等元素属性是一致的,这时,使用ID、NAME、CLASS_NAME等这些元素属性定位时就无法准确地定位到具体的元素。例如,在百度首页中,以TAG_NAME元素属性来定位百度搜索输入框,在代码中发现不仅仅在百度搜索输入框有 input 标签,在百度搜索输入框之前也有 input 标签,这时该如何定位呢?这时可以使用多个元素定位的方式。当定位到多个元素后,结果将以列表形式呈现,然后可以按照列表的索引来定位到具体的元素位置。下面以ID、TAG_NAME为例进行讲解。

    3.2.1 find_elements_by_tag_name
    以百度搜索输入框为例,使用 TAG_NAME的方式来实现定位,它的TAG_NAME是input,首先来获取百度首页的input标签,并且查看它的类型,代码如下:

    from selenium import webdriver
    import time
    url="https://www.baidu.com/"
    driver=webdriver.Firefox()
    driver.maximize_window()
    driver.implicitly_wait(30)
    driver.get(url=url)
    tag_names=driver.find_elements_by_tag_name('input')#查找多个tag_name是input的标签
    for tag_name in tag_names:
        print(tag_name)
    print(type(tag_names))
    time.sleep(5)
    driver.quit()
    

    显示:

    <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="e0709efe-1afb-4ef5-9b2e-e77dc3d12c7a", element="c9a5079b-dcb2-4c95-8ea8-c89481dd28da")>
    <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="e0709efe-1afb-4ef5-9b2e-e77dc3d12c7a", element="ac186d77-1230-4dbb-b315-68d8a19433bc")>
    <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="e0709efe-1afb-4ef5-9b2e-e77dc3d12c7a", element="80bcf2b9-4c85-4890-9858-711e445ac52b")>
    <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="e0709efe-1afb-4ef5-9b2e-e77dc3d12c7a", element="31fab697-2d82-42e1-ab82-69d11d98a2c8")>
    <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="e0709efe-1afb-4ef5-9b2e-e77dc3d12c7a", element="b5b40ed1-ccd1-4ab7-b6f1-79b3b6e8bb20")>
    <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="e0709efe-1afb-4ef5-9b2e-e77dc3d12c7a", element="08a8419c-5c63-4eb2-ac51-11c0e8c20aae")>
    <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="e0709efe-1afb-4ef5-9b2e-e77dc3d12c7a", element="6df6e33a-652f-487a-a1f1-3ab2a4875000")>
    <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="e0709efe-1afb-4ef5-9b2e-e77dc3d12c7a", element="50cfc5e3-de93-4b85-94f0-0267f8c55367")>
    <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="e0709efe-1afb-4ef5-9b2e-e77dc3d12c7a", element="166d64e7-8086-445e-94ce-e7f912c8f783")>
    <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="e0709efe-1afb-4ef5-9b2e-e77dc3d12c7a", element="5ae33151-3175-40a7-98ea-baa3d3c5253b")>
    <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="e0709efe-1afb-4ef5-9b2e-e77dc3d12c7a", element="6f536224-37b7-4b35-95d7-793e4070bf26")>
    <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="e0709efe-1afb-4ef5-9b2e-e77dc3d12c7a", element="0658bacb-625f-4e84-8716-7bbd8d0b4576")>
    <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="e0709efe-1afb-4ef5-9b2e-e77dc3d12c7a", element="d0cf47e4-11a2-4d51-9235-f6c588675f08")>
    <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="e0709efe-1afb-4ef5-9b2e-e77dc3d12c7a", element="e1b5a5f3-e156-4264-a7e4-e93ca0465a7f")>
    <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="e0709efe-1afb-4ef5-9b2e-e77dc3d12c7a", element="6e3d24ba-903f-4b1e-a771-93d9074c9544")>
    <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="e0709efe-1afb-4ef5-9b2e-e77dc3d12c7a", element="35961a93-6b88-4b2d-bf55-a4a3ff2aa58c")>
    <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="e0709efe-1afb-4ef5-9b2e-e77dc3d12c7a", element="6d58e3dd-b089-46a6-8681-19b7ca114a91")>
    <class 'list'>
    Process finished with exit code 0
    

    注解:从以上代码和输出结果中,可以看到,input的数据类型是 list,那么百度首页搜索输入框是在input标签中的第8位,也就是对应的索引是7(索引是从0开始),如图所示。


    image.png

    实际代码如下:

    from selenium import webdriver
    import time
    url="https://www.baidu.com/"
    driver=webdriver.Firefox()
    driver.maximize_window()
    driver.implicitly_wait(30)
    driver.get(url=url)
    tag_names=driver.find_elements_by_tag_name('input')[7].send_keys('selenium')#查找多个tag_name是input的标签,第7个就是要的
    time.sleep(5)
    driver.quit()
    

    3.2.2 find_elements_by_id

    先自定义一个html文件文件名index.html,内容如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <form action="success.html" method="post">
        <center>
            <p>用户名: <input type="text" id="login" name="username"></p>
            <p>密码:<input type="text" id="login" name="password"></p>
            <p><input type="submit" id="login" value="登录"></p>
        </center>
    </form>
    </body>
    </html>
    

    在以上代码中可以看到用户名输入框、密码输入框,以及“登录”按钮的ID 一致,现在希望通过脚本输入用户名和密码,点击“登录”按钮,跳转到success.html的页面,并且使用 ID来定位。在以上代码中看到用户名和密码输入框,以及登录按钮的ID一致,实现的代码如下:

    from selenium import webdriver
    driver=webdriver.Firefox()
    driver.maximize_window()
    driver.implicitly_wait(30)
    #根据自己实际路径填写
    driver.get('file:///E:/test01/index.html')
    ids=driver.find_elements_by_id('login')
    #输入用户名
    ids[0].send_keys('hcc')
    #输入密码
    ids[1].send_keys('123')
    #点击登录
    ids[2].click()
    driver.quit()
    

    PS:不要去纠结代码报错,这里只看方式

    1. By类的分析

    导入模块:from selenium.webdriver.common.by import By

    如果在定位元素属性中包含了如 ID 等元素属性,那么在一个测试中,元素定位具体有哪几种方式,可以在by模块中的By类中看到。By类的代码如下:

    """
    The By implementation.
    """
    
    
    class By(object):
        """
        Set of supported locator strategies.
        """
    
        ID = "id"
        XPATH = "xpath"
        LINK_TEXT = "link text"
        PARTIAL_LINK_TEXT = "partial link text"
        NAME = "name"
        TAG_NAME = "tag name"
        CLASS_NAME = "class name"
        CSS_SELECTOR = "css selector"
    

    注解:在By 类中,类属性实际就是元素定位的方式,经常使用的有 ID、NAME等。

    1. iframe元素定位实战

    在自动化测试中,如果无法定位到一个元素,那么最大的可能是定位的元素属性在iframe 框架中。iframe 对象代表一个HTML 的内联框架,在HTML 中iframe每出现一次,一个iframe对象就会被创建。

    4.1 .处理未嵌套的iframe
    图4.1


    image.png

    实现以上截图效果的HTML代码如下。其中frame.html代码为:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <center>
        <a href="frame-1.html" target="10">练习课堂</a>
        <a href="frame-2.html" target="10">Python接口测试实战</a><br><br>
    </center>
    <iframe id="text" src="frame-1.html"  name="10-20" width="500" height="170" align="center" >
    
    </iframe>
    </body>
    </html>
    

    frame-1.html代码为:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <center>
        <font size="5">练习课堂</font>
    </center>
        Python自动化教程,欢迎大家关注<br>
    </body>
    </html>
    

    frame-2.html代码如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <center>
        <font size="5">Python接口测试实战</font> <br> <br>
    </center>
    基于python语言的接口自动化测试实战课程
    </body>
    </html>
    

    在图4.1中,想要获取iframe框架中的“练习课堂”,实现的代码如下:

    from selenium import webdriver
    driver=webdriver.Firefox()
    driver.maximize_window()
    driver.implicitly_wait(30)
    driver.get('file:///C:/Users/Administrator/Desktop/testpy/frame.html')#根据自己实际路径
    driver.switch_to.frame('text')#通过id切换到frame中
    #driver.switch_to.frame(0) #通过索引进入到frame框架
    text1=driver.find_element_by_xpath('/html/body/center/font').text
    print(text1)
    driver.quit()
    

    4.2 处理嵌套的iframe

    下面来看嵌套的iframe 在自动化测试中如何进行元素定位,以及如何跳出嵌套。嵌套页面的效果如图4.2所示。

    图4.2


    image.png

    在图4.2中可以看到在一个页面里面嵌套了Bing 搜索的首页,该页面的HTML代码如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta http-equiv="content-type" content="text/html" charset="UTF-8">
        <title>嵌套的页面</title>
    </head>
    <body>
    <center>
        <iframe id="son" src="http://www.bing.com" width="800" height="400" frameborder="0">
    
        </iframe>
    </center>
    <br> <br>
    </body>
    </html>
    

    在该页面要实现 Bing的搜索效果,首先需要进入到 iframe框架中,然后再定位Bing首页搜索输入框的元素属性。该iframe的ID是son,Bing首页搜索输入框的元素属性 ID是 sb_form_q。实现在Bing首页搜索输入框中输入搜索关键字的代码如下:

    from selenium import webdriver
    import time
    driver=webdriver.Firefox()
    driver.maximize_window()
    driver.implicitly_wait(30)
    driver.get('file:///C:/Users/Administrator/Desktop/testpy/bing.html')#根据自己实际路径
    driver.switch_to.frame('son')
    driver.find_element_by_id('sb_form_q').send_keys('selenium')
    time.sleep(5)
    driver.quit()
    

    下面是一个多层级的嵌套页面在自动化测试中的应用实例,如图4.3所示。
    图4.3


    image.png

    HTML代码如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta http-equiv="content-type" content="text/html" charset="UTF-8">
        <title>多层嵌套</title>
    </head>
    <body>
    <center>
        <iframe id="parent" src="bing.html" width="1000" height="300" align="center"  frameborder="0">
        </iframe>
    </center>
    <hr>
    <center>
        请输入用户名: <input type="text" id="userid" name="username" class="classname">
    </center>
    </body>
    </html>
    

    在以上 HTML代码中,可以看到 Bing首页的搜索多了二层嵌套,页面层级结构如图4-3-1所示。
    图4-3-1


    image.png

    要想在Bing 首页搜索输入框中输入搜索关键字 Selenium,然后在下面的用户名输入框中输入Selenium,实现的代码如下:

    from selenium import webdriver
    import time
    driver=webdriver.Firefox()
    driver.maximize_window()
    driver.implicitly_wait(30)
    driver.get('file:///C:/Users/Administrator/Desktop/testpy/second.html')#根据自己实际路径
    #根据id进入到第一层frame框架中
    driver.switch_to.frame('parent')
    #根据id进入到第二层frame框架中
    driver.switch_to.frame('son')
    #输入搜素关键字selenium
    driver.find_element_by_id('sb_form_q').send_keys('selenium')
    time.sleep(5)
    #5秒后清空输入的关键字
    driver.find_element_by_id('sb_form_q').clear()
    #跳出frame框架
    driver.switch_to.default_content()
    #用户名输入框中输入selenium
    driver.find_element_by_name('username').send_keys('selenium')
    time.sleep(5)
    #5秒后清空输入用户名的关键字
    driver.find_element_by_name('username').clear()
    driver.quit()
    

    结尾总结:


    Selenium元素定位实战.png

    相关文章

      网友评论

          本文标题:2021-04-08 Selenium元素定位实战

          本文链接:https://www.haomeiwen.com/subject/miymkltx.html