zoukankan      html  css  js  c++  java
  • selenium-页面操作

    1 web

    1.1 简单介绍

    Web应用程序的测试工具很多种,关于web前端技术如HTML,JS,CSS等的基础知识本文不作介绍,本节只介绍selenium工具在web应用程序自动化测试中的简单应用。

    1.1.1 准备工作

    [1].          安装pip

    说明:见3 环境搭建

    [2].          安装selenium

    说明:pip install selenium

    [3].           安装chrome.exe浏览器

    说明:推荐版本 63.0.3239.84(正式版本)(32 位)

    [4].          准备chromedriver2.33.exe

    说明:存放在resource oolschromedriver2.33.exe,程序使用,不需要手动特别安装。

    1.2 快速入门

     1 from selenium import webdriver
     2 from selenium.webdriver.support.select import Select
     3 
     4 def refresh(brower, trytimes=10):
     5     """
     6     Sometimes, the element actually exits and the way we locate is right,
     7     but there still raises exception like "cannot locate element"; the root
     8     cause not found; this function is a temperoary way to fix it.
     9     """
    10     try:
    11         all_div = brower.find_elements_by_tag_name("div")
    12         all_td = brower.find_elements_by_tag_name("td")
    13         for div in all_div:
    14             logging.debug(div.get_attribute("id"))
    15         for td in all_td:
    16             logging.debug(td.get_attribute("id"))
    17     except Exception as e:
    18         logging.debug(e)
    19         if (trytimes > 0):
    20             refresh(trytimes - 1)
    21         else:
    22             raise ValueError
    23 
    24 #打开chrome浏览器,并带着http://admin:90123456@192.168.1.1请求加载web页面
    25 #reates a new instance of the chrome driver.
    26 b = webdriver.Chrome(r"D:auto testTogether_v0.2
    esource	oolschromedriver2.33.exe")
    27 #Loads a web page in the current browser session.
    28 b.get("http://admin:90123456@192.168.1.1")
    29 b.get("http://192.168.1.1") # sugget one more try.
    30 
    31 #Switches focus to the specified frame, by index, name, or webelement.
    32 b.switch_to.frame("fInfo")
    33 
    34 #依次点击Features -> ACL, 转到ACL控制页面
    35 #Finds an element by xpath. && Clicks the element.
    36 b.find_element_by_xpath("//*[@id="menu"]/ul/li[3]").click() #click Features
    37 b.find_element_by_xpath("//*[@id="menu"]/ul/li[3]/ul/li[3]/a").click() #click Features -> ACL
    38 
    39 # suggest wait seconds after enter another page.
    40 import time
    41 time.sleep(7)
    42 
    43 # temporary way to fix exception "cannot locate element".
    44 refresh(b)
    45 
    46 #设置ACL Rule Index旁边的下拉框为可见,只有可见之后,才能用Select库的相关选择函数。
    47 #Synchronously Executes JavaScript in the current window/frame.
    48 b.execute_script('document.getElementById("RuleIndexSEL").style.display="block";')  #Features >> ACL , set select "ACL Rule Index" can be seen.
    49 #选择ACL Rule Index旁边的下拉框为3
    50 # for SELECT tag, select an option <option value="2">3</option>
    51 Select(b.find_element_by_id("RuleIndexSEL")).select_by_value('2') #Features >> ACL ,  select option 3 in select "ACL Rule Index"
    52 
    53 #点击Active旁边的按钮,设置为enable
    54 #Finds an element by id. && Clicks the element.
    55 b.find_element_by_id("RuleActiveRDO").click() #Features >> ACL , click "Active" to enable
    56 
    57 #设置Interface旁边的下拉框为可见
    58 b.execute_script('document.getElementById("InterfaceSEL").style.display="block";') #Features >> ACL ,set select "Interface" can be seen.
    59 #选择Interface旁边的下拉框的选项为LAN
    60 # for SELECT tag, select an option <option value="LAN">LAN</option>
    61 Select(b.find_element_by_id("InterfaceSEL")).select_by_value("LAN") #Features >> ACL , elect option LAN in select "Interface"
    62 
    63 #点击SET按钮,保存页面的配置。
    64 b.find_element_by_xpath("//*[@id="rightFunc"]/li[4]/div[1]").click() #Features >> ACL , click "SET" button to save settings.
    65 
    66 #关闭页面
    67 b.close()

    1.3 代码解释

    1.3.1 初始化

    需要先导入相关类库,导入方法如下:

    from selenium import webdriver
    from selenium.webdriver import ActionChains
    from selenium.webdriver.support.select import Select

     
    实例化一个类WebDriver类,实例方法如下,参数是chromedriver的路径:

    e.g: browser = webdriver.Chrome("resource oolschromedriver2.33.exe")

    该函数参数详细介绍:

        webdriver.Chrome(executable_path="chromedriver", port=0,

                     chrome_options=None, service_args=None,

                     desired_capabilities=None, service_log_path=None):

            """

            Creates a new instance of the chrome driver.

            Starts the service and then creates new instance of chrome driver.

            :Args:

             - executable_path - path to the executable. If the default is used it assumes the executable is in the $PATH

             - port - port you would like the service to run, if left as 0, a free port will be found.

             - desired_capabilities: Dictionary object with non-browser specific

               capabilities only, such as "proxy" or "loggingPref".

             - chrome_options: this takes an instance of ChromeOptions

            """

    1.3.2 加载页面

    打开浏览器并加载指定url时,使用get(url函数

    e.g: brower.get("http://loginName@loginPasword@192.168.1.1")
    e.g: brower.get("http://192.168.1.1")

    该函数参数详细介绍:

        browser.get(url):

            """

            Loads a web page in the current browser session.

            """

    1.3.3 元素定位

    定位元素的目的是为了改变或者获取元素的相关信息,在定位到指定元素之后,才可以对其执行点击鼠标、拖动鼠标等操作。元素定位的方法比较多也比较丰富,本节指出几个常用的定位方法。使用的例子依据的html源码如下图所示。关于selenium的元素定位的函数的详细介绍见 [附录A.2.1 find_elemet(s)_XXX]

     

    通过XPath定位获取text为”LAN”的td元素 (关于XPath的获取参见[附录B.1])

    element = browser.find_element_by_xpath("//*[@id="main"]/table/tbody/tr/td[5]")
    elements = browser.find_elements_by_xpath("//*[@id="main"]/table/tbody/tr/td[5]")

    find_element_XXXX(…) 与 find_elements_XXX(…)函数的参数及意义是一样的。区别在于它们的返回值,前者是返回一个element,后者是返回一个element列表;

    通过id定位获取id值为RuleActiveRDO_ck的元素

    element=browser.find_element_by_id("RuleActiveRDO_ck")

    通过name定位获取name值为RuleActiveRDO_ck的元素

    element=browser.find_element_by_name("RuleActiveRDO_ck")

    通过tag_name定位获取td元素(tag_name指标签名称)

    element=browser.find_element_by_tag_name("td")

    通过class_name定位class值为mainTable的table元素

    element=browser.find_element_by_class_name("mainTable")

    1.3.4 元素信息

    获取element的属性值

    element = browser.find_element_by_id("InterfaceSEL")
    val = element.get_attribute("id")   # InterfaceSEL
    val = element.get_attribute("name") # InterfaceSEL
    val = element.get_attribute("sb") # 30512517
    val = element.get_attribute("style") # display: none;

     

    获取element的标签名称

    element = browser.find_element_by_id("InterfaceSEL")

    val = element.tag_name # select

    获取element的文本框

    element=browser.find_element_by_xpath("//*[@id="main"]/table/tbody/tr/td[5]")
    val = element.text # LAN

    查看元素对用户是否可见

    val = element.is_displayed() #True of False

    查看元素是否被选中,比如可检查checkbox或radio按钮是否被选中

    val = element.is_selected() #True of False

    获取浏览器当前url

    val = browser.current_url

    获取当前页面的源码

    val = browser.page_source

    1.3.5 动作事件

    获取到element元素后,可以对元素执行鼠标、键盘甚至执行script脚本等动作事件。本节介绍本人已知的并且经常用到的几个方法。

    (一) WebDriver

    在当前的window/frame中执行一段JaveScript脚本,比如下面这条语句是将id为InterfaceSEL的select元素由不可见变成可见:

    browser = webdriver.Chrome(r"resource oolschromedriver2.33.exe")

    browser.execute_script('document.getElementById("InterfaceSEL").style.display="block";'

    执行之前:

     

    执行之后

     

    如下语句效果是等同的。

    browser.execute_script(‘'document.getElementById("hid_password").value = "admin";’)

    browser.find_element_by_id("hid_password").send_keys("admin")

    浏览器的历史记录中,退回到上一个页面

    browser.back()

    浏览器的历史记录中,前进到下一个页面

    browser.forward()

    页面刷新,同按F5效果类似

    browser.refresh()

    关于frame;在html页面中,存在着用frame标签嵌套另一个html页面的情况,如下面的名为debug.html的页面的源代码如下,在debug.html中又嵌套了两个frame, 其中一个frame的name属性为”finfo”, 如果要控制name=”fInfo”中的元素如id=”test”的input, 需要先把控制焦点转到fInfo的frame上。

    转到特定frame:browser.switch_to.frame("fInfo")

    回到默认frame:brower.switch_to.default_content()

    debug.html

    <html>

    <frame name="fPanel" src="" scrolling="auto" marginwidth="0" marginheight="0">

             <html><head></head><body marginwidth="0" marginheight="0"></body></html>

    </frame>

    <frame name="fInfo" src="/cgi-bin/New_GUI/Home.asp">

             <html><input id="test"/></html>

    </frame>

    </html>

    (二) WebElement

    单击元素

    element = browser.find_element_by_id("RuleActiveRDO_ck")
    element.click()

    清除文本,通常用于情况文本输入框的内容。

    element = browser.find_element_by_name("fname")
    element.clear()

    在元素上模拟按键输入

    element = browser.find_element_by_name("lname")
    element.send_keys("auto test lname")

    (三)Select标签

    在对select标签运用selenium.webdriver.support.select之前,需要先使该标签对用户是可见的,设置方法见1.3.5 (一),在selenium.webdriver中关于select标签的操作由Select提供。

    导入:from selenium.webdriver.support.select import Select

    #选中WAN_Option
    Select(element).select_by_value("WAN")

    #选中LAN_Option
    Select(element).select_by_index(1)

    (四)ActionChains

    在selenium.webdriver中关于鼠标的操作由ActionChains提供。

     

    导入:from selenium.webdriver import ActionChains

     

    常用的方法有

    move_to_element(to_element):鼠标悬停,有些菜单需要鼠标停在该位置处,才能出现下拉菜单。

    double_click(on_element=None):在指定元素或者当前位置处双击鼠标

    click(on_element=None): 在指定元素或者当前位置处单击鼠标

    context_click(on_element=None): 在指定元素或者当前位置处右击鼠标

    以上四个动作都需要调用perform()才会被执行。

    以下是几个使用例子:

    from selenium import webdriver
    from selenium.webdriver import ActionChains

    browser = webdriver.Chrome(r"D:auto testTogether_v0.2 esource oolschromedriver2.33.exe")
    browser.get("file:///C:/Users/20002106/Desktop/temp/auto-test.html")

    #定位到提交按钮元素
    element = browser.find_element_by_xpath("/html/body/div[2]/form/input[3]")
    #将鼠标悬停在提交按钮
    ActionChains(browser).move_to_element(element).perform()
    #在提交按钮处双击
    ActionChains(browser).double_click(element).perform()
    #在提交按钮处单击
    ActionChains(browser).click(element).perform()
    #在提交按钮处右击鼠标
    ActionChains(browser).context_click(element).perform()

    1.3.6 断开连接

    需要关闭当前窗口并退出chrome浏览器时,可用quit()和close()中的任何一个函数。

    e.g browser.quit()
    e.g browser.close()

    函数参数详细介绍

     browser.close():

            """

            Closes the current window.

            :Usage:

                driver.close()

            """

    browser.quit():

            """

            Quits the driver and closes every associated window.

            :Usage:

                driver.quit()

            """

    1.4 Reference

    [1].          http://www.selenium.org

    A.2 webdriver

    A.2.1 find_element(s)_XXX

      1  def webdriver.find_element_by_id(id_):
      2 
      3         """Finds an element by id.
      4 
      5  
      6 
      7         :Args:
      8 
      9          - id\_ - The id of the element to be found.
     10 
     11  
     12 
     13         :Usage:
     14 
     15             driver.find_element_by_id('foo')
     16 
     17         """
     18 
     19         
     20 
     21     webdriver.find_elements_by_id(id_):
     22 
     23         """
     24 
     25         Finds multiple elements by id.
     26 
     27  
     28 
     29         :Args:
     30 
     31          - id\_ - The id of the elements to be found.
     32 
     33  
     34 
     35         :Usage:
     36 
     37             driver.find_elements_by_id('foo')
     38 
     39         """
     40 
     41         
     42 
     43     webdriver.find_element_by_xpath(xpath):
     44 
     45         """
     46 
     47         Finds an element by xpath.
     48 
     49  
     50 
     51         :Args:
     52 
     53          - xpath - The xpath locator of the element to find.
     54 
     55  
     56 
     57         :Usage:
     58 
     59             driver.find_element_by_xpath('//div/td[1]')
     60 
     61         """
     62 
     63         
     64 
     65     webdriver.find_elements_by_xpath(xpath):
     66 
     67         """
     68 
     69         Finds multiple elements by xpath.
     70 
     71  
     72 
     73         :Args:
     74 
     75          - xpath - The xpath locator of the elements to be found.
     76 
     77  
     78 
     79         :Usage:
     80 
     81             driver.find_elements_by_xpath("//div[contains(@class, 'foo')]")
     82 
     83         """
     84 
     85         
     86 
     87     webdriver.find_element_by_link_text(link_text):
     88 
     89         """
     90 
     91         Finds an element by link text.
     92 
     93  
     94 
     95         :Args:
     96 
     97          - link_text: The text of the element to be found.
     98 
     99  
    100 
    101         :Usage:
    102 
    103             driver.find_element_by_link_text('Sign In')
    104 
    105         """
    106 
    107         
    108 
    109     webdriver.find_elements_by_link_text(text):
    110 
    111         """
    112 
    113         Finds elements by link text.
    114 
    115  
    116 
    117         :Args:
    118 
    119          - link_text: The text of the elements to be found.
    120 
    121  
    122 
    123         :Usage:
    124 
    125             driver.find_elements_by_link_text('Sign In')
    126 
    127         """
    128 
    129         
    130 
    131     webdriver.find_element_by_partial_link_text(link_text):
    132 
    133         """
    134 
    135         Finds an element by a partial match of its link text.
    136 
    137  
    138 
    139         :Args:
    140 
    141          - link_text: The text of the element to partially match on.
    142 
    143  
    144 
    145         :Usage:
    146 
    147             driver.find_element_by_partial_link_text('Sign')
    148 
    149         """
    150 
    151         
    152 
    153     webdriver.find_elements_by_partial_link_text(link_text):
    154 
    155         """
    156 
    157         Finds elements by a partial match of their link text.
    158 
    159  
    160 
    161         :Args:
    162 
    163          - link_text: The text of the element to partial match on.
    164 
    165  
    166 
    167         :Usage:
    168 
    169             driver.find_element_by_partial_link_text('Sign')
    170 
    171         """
    172 
    173         
    174 
    175     webdriver.find_element_by_name(name):
    176 
    177         """
    178 
    179         Finds an element by name.
    180 
    181  
    182 
    183         :Args:
    184 
    185          - name: The name of the element to find.
    186 
    187  
    188 
    189         :Usage:
    190 
    191             driver.find_element_by_name('foo')
    192 
    193         """
    194 
    195         
    196 
    197     webdriver.find_elements_by_name(self, name):
    198 
    199         """
    200 
    201         Finds elements by name.
    202 
    203  
    204 
    205         :Args:
    206 
    207          - name: The name of the elements to find.
    208 
    209  
    210 
    211         :Usage:
    212 
    213             driver.find_elements_by_name('foo')
    214 
    215         """
    216 
    217         
    218 
    219     webdriver.find_element_by_tag_name(name):
    220 
    221         """
    222 
    223         Finds an element by tag name.
    224 
    225  
    226 
    227         :Args:
    228 
    229          - name: The tag name of the element to find.
    230 
    231  
    232 
    233         :Usage:
    234 
    235             driver.find_element_by_tag_name('foo')
    236 
    237         """
    238 
    239         
    240 
    241     webdriver.find_elements_by_tag_name(name):
    242 
    243         """
    244 
    245         Finds elements by tag name.
    246 
    247  
    248 
    249         :Args:
    250 
    251          - name: The tag name the use when finding elements.
    252 
    253  
    254 
    255         :Usage:
    256 
    257             driver.find_elements_by_tag_name('foo')
    258 
    259         """
    260 
    261         
    262 
    263     webdriver.find_element_by_class_name(name):
    264 
    265         """
    266 
    267         Finds an element by class name.
    268 
    269  
    270 
    271         :Args:
    272 
    273          - name: The class name of the element to find.
    274 
    275  
    276 
    277         :Usage:
    278 
    279             driver.find_element_by_class_name('foo')
    280 
    281         """
    282 
    283         
    284 
    285     webdriver.find_elements_by_class_name(name):
    286 
    287         """
    288 
    289         Finds elements by class name.
    290 
    291  
    292 
    293         :Args:
    294 
    295          - name: The class name of the elements to find.
    296 
    297  
    298 
    299         :Usage:
    300 
    301             driver.find_elements_by_class_name('foo')
    302 
    303         """
    304 
    305         
    306 
    307     webdriver.find_element_by_css_selector(css_selector):
    308 
    309         """
    310 
    311         Finds an element by css selector.
    312 
    313  
    314 
    315         :Args:
    316 
    317          - css_selector: The css selector to use when finding elements.
    318 
    319  
    320 
    321         :Usage:
    322 
    323             driver.find_element_by_css_selector('#foo')
    324 
    325         """
    326 
    327         
    328 
    329     webdriver.find_elements_by_css_selector(css_selector):
    330 
    331         """
    332 
    333         Finds elements by css selector.
    334 
    335  
    336 
    337         :Args:
    338 
    339          - css_selector: The css selector to use when finding elements.
    340 
    341  
    342 
    343         :Usage:
    344 
    345             driver.find_elements_by_css_selector('.foo')
    346 
    347         """
    find_elements_XXX
  • 相关阅读:
    流处理 —— Spark Streaming中的Window操作
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.8 提供带注解的限定符元数据
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.7 为自动检测组件提供作用域
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.6 给自动检测组件命名
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.5 在组件中定义bean的元数据
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.4 使用过滤器自定义扫描
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.3 自动检测类和注册bean的定义
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.2 元注解
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.1 @Component和深层的构造型注解
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10 类路径扫描和被管理的组件
  • 原文地址:https://www.cnblogs.com/aimmiao/p/12745591.html
Copyright © 2011-2022 走看看