zoukankan      html  css  js  c++  java
  • UI自动化测试实战之Select类实战(四)

     一、Select类实战

    1.1、源码分析

         在UI的自动化测试实战中,如果遇到下拉框的选择,我们可以使用Select类里面的方法来具体进行

    定位和解决。下面我们使用HTML的代码来写一个下拉框的页面交互,让大家从直观上知道下拉框的交

    互到底是怎么样的,HTML的源码信息如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <center>
            喜欢的编程语言:
            <select id="nr">
                <option  value="" selected>请选择您喜欢的编程语言</option>
                <option value="Python">Python语言</option>
                <option value="Go">Go语言</option>
                <option value="Java">Java语言</option>
            </select>
        </center>
    </body>
    </html>

    如上是HTML的源代码,下面具体看看交互的信息,如下所示:

    在这样一个下拉框的交互中,我们需要获取到下拉框的选项,来定位下拉框的内容,这是我们在工作里面的

    具体交互,在WebDriver的测试框架中,我们可以使用Select类来处理下拉框的交互,在使用它之前,我们首

    先来看这个类的构造方法,因为构造方法会告诉我们如何初始化这个类,具体源码的信息如下:

    class Select(object):
    
        def __init__(self, webelement):
            """
            Constructor. A check is made that the given element is, indeed, a SELECT tag. If it is not,
            then an UnexpectedTagNameException is thrown.
    
            :Args:
             - webelement - element SELECT element to wrap
    
            Example:
                from selenium.webdriver.support.ui import Select 
    
                Select(driver.find_element(By.TAG_NAME, "select")).select_by_index(2)
            """
            if webelement.tag_name.lower() != "select":
                raise UnexpectedTagNameException(
                    "Select only works on <select> elements, not on <%s>" %
                    webelement.tag_name)
            self._el = webelement
            multi = self._el.get_attribute("multiple")
            self.is_multiple = multi and multi != "false"

    在如上的源码体系中,我们就可以得到该类初始化的时候,需要获取元素属性的对象,从这些信息,可以总结

    的得出针对下拉框的这部分,元素定位的方式步骤具体为:

    • 首先获取下拉框的属性,当然这些属性可以是id,name以及xpath的信息
    • 拿到下拉框属性的对象,然后实例化Select的类
    • 下来调用该类里面的方法来获取下拉框选项里面的具体内容

    在Select的类里面,针对获取下拉框选项里面的内容,使用到的方法主要是索引方式,和文本信息以及text的

    方式。

    1.2、下拉框定位实战

             针对如上的,下面通过三种的方式来定位下拉框的内容,具体涉及到的方法以及案例实战的代码具体在

    如下会详细的演示它的应用。

    1.2.1、select_by_index()

                 select_by_index()的方法是通过索引的方式,如我们在上面的交互中,我们想选择下拉框中的Go

    语言,它是在第三位,那么它的索引就是2,因为索引是从0开始,下面的代码案例主要是以索引的方式

    来进行定位的,具体案例实战代码如下:

    from selenium import  webdriver
    from selenium.webdriver.support.select import Select
    import  time as t
    
    driver=webdriver.Chrome()
    driver.maximize_window()
    driver.get('file:///Applications/code/Yun/%E9%9B%B6%E5%9F%BA%E7%A1%80%E6%B5%8B%E8%AF%95/index.html')
    #定位到下拉框的元素属性
    nr=driver.find_element_by_id('nr')
    select=Select(webelement=nr)
    select.select_by_index(2)
    t.sleep(3)
    driver.quit()

    1.2.2、select_by_value()

                select_by_value()方法是通过value的方式来进行定位,也就是标签中option里面的value属性来进行定位

    ,比如我们还是Go语言,那么它的value的值就是“Go”,具体见如下的案例代码:

    from selenium import  webdriver
    from selenium.webdriver.support.select import Select
    import  time as t
    
    driver=webdriver.Chrome()
    driver.maximize_window()
    driver.get('file:///Applications/code/Yun/%E9%9B%B6%E5%9F%BA%E7%A1%80%E6%B5%8B%E8%AF%95/index.html')
    #定位到下拉框的元素属性
    nr=driver.find_element_by_id('nr')
    select=Select(webelement=nr)
    select.select_by_value("Go")
    t.sleep(3)
    driver.quit()

    1.2.3、select_by_text()

                 select_by_text()的方法是通过文本信息来定位的,比如下拉框还是想选择Go,那么它的文本信息其实就

    是“Go语言”,见这部分的案例实战代码:

    from selenium import  webdriver
    from selenium.webdriver.support.select import Select
    import  time as t
    
    driver=webdriver.Chrome()
    driver.maximize_window()
    driver.get('file:///Applications/code/Yun/%E9%9B%B6%E5%9F%BA%E7%A1%80%E6%B5%8B%E8%AF%95/index.html')
    #定位到下拉框的元素属性
    nr=driver.find_element_by_id('nr')
    select=Select(webelement=nr)
    t.sleep(3)
    select.select_by_visible_text("Go语言")
    t.sleep(3)
    driver.quit()

    1.2.4、first_selected_option

                  first_selected_option返回下拉框中选中的第一个选项的内容,该方法是特性方法,特性方法就是

    只读属性,下面具体演示它的应用,案例实战代码如下:

    from selenium import  webdriver
    from selenium.webdriver.support.select import Select
    import  time as t
    
    driver=webdriver.Chrome()
    driver.maximize_window()
    driver.get('file:///Applications/code/Yun/%E9%9B%B6%E5%9F%BA%E7%A1%80%E6%B5%8B%E8%AF%95/index.html')
    #定位到下拉框的元素属性
    nr=driver.find_element_by_id('nr')
    select=Select(webelement=nr)
    t.sleep(3)
    print(select.first_selected_option)
    t.sleep(3)
    driver.quit()

    1.2、其他案例实战

               在实际的工作中,前端程序员总是不遵守规则的,也就是说实现的下拉框的选项并不是很标

    准的select,那么这个时候到底如何解决了,比如看下面的拉勾网的下拉框的选项:

    在工作性质里面选择对应的下拉框,我们看这部分的HTML的源码,具体如下:

           <span class="title">工作性质:</span>
                                                                                                                                                                        <div class="selectUI-text value text"><span>不限</span><i></i>
                                <ul>
                                            <li><a rel="nofollow" href="https://www.lagou.com/jobs/list_%E6%B5%8B%E8%AF%95%E5%BC%80%E5%8F%91%E5%B7%A5%E7%A8%8B%E5%B8%88?px=default&city=全国#order" data-lg-tj-id="8z00" data-lg-tj-no="
                                                                0001
                                                        " data-lg-tj-cid="idnull">不限</a></li>
                                            <li><a rel="nofollow" href="https://www.lagou.com/jobs/list_%E6%B5%8B%E8%AF%95%E5%BC%80%E5%8F%91%E5%B7%A5%E7%A8%8B%E5%B8%88?px=default&gx=全职&city=全国#order" data-lg-tj-id="8z00" data-lg-tj-no="
                                                                0002
                                                        " data-lg-tj-cid="idnull">全职</a></li>
                                            <li><a rel="nofollow" href="https://www.lagou.com/jobs/list_%E6%B5%8B%E8%AF%95%E5%BC%80%E5%8F%91%E5%B7%A5%E7%A8%8B%E5%B8%88?px=default&gx=兼职&city=全国#order" data-lg-tj-id="8z00" data-lg-tj-no="
                                                                0003
                                                        " data-lg-tj-cid="idnull">兼职</a></li>
                                            <li><a rel="nofollow" href="https://www.lagou.com/jobs/list_%E6%B5%8B%E8%AF%95%E5%BC%80%E5%8F%91%E5%B7%A5%E7%A8%8B%E5%B8%88?px=default&gx=实习&city=全国&isSchoolJob=1#order" data-lg-tj-id="8z00" data-lg-tj-no="
                                                                0004
                                                        " data-lg-tj-cid="idnull">实习</a></li>
                                        </ul>

    那么针对这种下拉框的选择,到底应该如何来进行定位和操作了,其实也是很简单的,它的步骤为:

    • 先定位到“工作性质”后,然后点击
    • 然后再选择下拉框中需要选择的项,定位到后进行点击,就能够定位到了

    下面使用具体的代码来演示下这部分的案例实战应用,涉及到的代码为:

    from selenium import  webdriver
    from selenium.webdriver.support.select import Select
    import  time as t
    
    driver=webdriver.Chrome()
    driver.maximize_window()
    driver.get('https://www.lagou.com/')
    t.sleep(3)
    driver.find_element_by_id('search_input').send_keys('测试开发工程师')
    driver.find_element_by_id('search_button').click()
    t.sleep(5)
    #定位到工作性质然后点击
    driver.find_element_by_xpath('//*[@id="order"]/li/div[3]/div').click()
    t.sleep(3)
    #选择下拉框中的全职
    driver.find_element_by_xpath('//*[@id="order"]/li/div[3]/div/ul/li[2]/a').click()
    t.sleep(3)
    driver.quit()

    如上,我们也是很轻松的解决了下拉框的选项的问题,说的简单点,不要固守成规,打破局部思维,不能

    说下拉框的,我们一定就得使用Select类里面的方法来定位,因为很多东西是动态的,我们不能因为程序

    员变化就抱怨对方,而说这部分由于你不规范,所以这部分自动化测试我无法实现,当然这样是不对的。

          感谢您的阅读和关注,您也扫描如下二维码加我,来参加我的《Python服务端测试开发》训练营的实战课程

    欢迎关注微信公众号“Python自动化测试”
  • 相关阅读:
    管理Linux软件——aptitude
    管理Linux软件——apt
    /etc/apt/sources.list 和 /etc/apt/sources.list.d
    JSR303参数校验正则表达式的莫名其妙的错误
    HighCharts 动态设置 series
    template might not exist or might not be accessible by any of the configured Template Resolvers
    springboot 热部署替代方式
    如果访问国外站点慢的话,可以多切换一下运营商,比如开热点。
    当 springboot 部署war包,tomcat报一堆无法解决的问题时
    thymeleaf在开发环境正常,但用jar运行时报错 Error resolving template template might not exist or might not be accessible
  • 原文地址:https://www.cnblogs.com/weke/p/15335097.html
Copyright © 2011-2022 走看看