zoukankan      html  css  js  c++  java
  • 基于python的selenium常用操作方法(2)

    9 多表单切换   

    在Web应用中经常会遇到frame/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌页面上的元素无法直接定位。这时就需要通过switch_to.frame()方法将当前定位的主体切换为frame/iframe表单的内嵌页面中。

    <html>
      <body>
        ...
        <iframe id="x-URS-iframe" ...>
          <html>
             <body>
               ...
               <input name="email" >

    126邮箱登录框的结构大概是这样子的,想要操作登录框必须要先切换到iframe表单。

    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.get("http://www.126.com")
    
    driver.switch_to.frame('x-URS-iframe')
    driver.find_element_by_name("email").clear()
    driver.find_element_by_name("email").send_keys("username")
    driver.find_element_by_name("password").clear()
    driver.find_element_by_name("password").send_keys("password")
    driver.find_element_by_id("dologin").click()
    driver.switch_to.default_content()
    
    driver.quit()

    switch_to.frame() 默认可以直接取表单的id 或name属性。如果iframe没有可用的id和name属性,则可以通过下面的方式进行定位。

    ……
    #先通过xpth定位到iframe
    xf = driver.find_element_by_xpath('//*[@id="x-URS-iframe"]')
    
    #再将定位对象传给switch_to.frame()方法
    driver.switch_to.frame(xf)
    ……

    driver.switch_to.parent_frame()

    除此之外,在进入多级表单的情况下,还可以通过switch_to.default_content()跳回最外层的页面。

    10 多窗口切换   

    在页面操作过程中有时候点击某个链接会弹出新的窗口,这时就需要主机切换到新打开的窗口上进行操作。WebDriver提供了switch_to.window()方法,可以实现在不同的窗口之间切换。 以百度首页和百度注册页为例,在两个窗口之间的切换如下图。

    from selenium import webdriver
    import time
    
    driver = webdriver.Firefox()
    driver.implicitly_wait(10)
    driver.get("http://www.baidu.com")
    # 获得百度搜索窗口句柄
    
    sreach_windows = driver.current_window_handle
    
    driver.find_element_by_link_text('登录').click()
    driver.find_element_by_link_text("立即注册").click()
    # 获得当前所有打开的窗口的句柄
    
    all_handles = driver.window_handles
    # 进入注册窗口
    
    for handle in all_handles:
        if handle != sreach_windows:
            driver.switch_to.window(handle)
            print('now register window!')
            driver.find_element_by_name("account").send_keys('username')
            driver.find_element_by_name('password').send_keys('password')
            time.sleep(2)
            # ……
    
    driver.quit()

    在本例中所涉及的新方法如下:

    ·         current_window_handle:获得当前窗口句柄。

    ·         window_handles:返回所有窗口的句柄到当前会话。

    ·         switch_to.window():用于切换到相应的窗口,与上一节的switch_to.frame()类似,前者用于不同窗口的切换,后者用于不同表单之间的切换。

    11 警告框处理   

    在WebDriver中处理JavaScript所生成的alert、confirm以及prompt十分简单,具体做法是使用 switch_to.alert 方法定位到 alert/confirm/prompt,然后使用text/accept/dismiss/ send_keys等方法进行操作。

    ·         text:返回 alert/confirm/prompt 中的文字信息。

    ·         accept():接受现有警告框。

    ·         dismiss():解散现有警告框。

    ·         send_keys(keysToSend):发送文本至警告框。keysToSend:将文本发送至警告框。

    如下图,百度搜索设置弹出的窗口是不能通过前端工具对其进行定位的,这个时候就可以通过switch_to_alert()方法接受这个弹窗。

    from selenium import webdriver
    from selenium.webdriver.common.action_chains import ActionChains
    import time
    
    driver = webdriver.Firefox()
    driver.implicitly_wait(10)
    driver.get('http://www.baidu.com')
    # 鼠标悬停至“设置”链接
    
    link = driver.find_element_by_link_text('设置')
    ActionChains(driver).move_to_element(link).perform()
    # 打开搜索设置
    
    driver.find_element_by_link_text("搜索设置").click()
    # 保存设置
    
    driver.find_element_by_class_name("prefpanelgo").click()
    time.sleep(2)
    # 接受警告框
    
    driver.switch_to.alert.accept()
    
    driver.quit()

    通过switch_to_alert()方法获取当前页面上的警告框,并使用accept()方法接受警告框。

    12 下拉框选择   

    有时我们会碰到下拉框,WebDriver提供了Select类来处理下拉框。 如百度搜索设置的下拉框,如下图:

    from selenium import webdriver
    from selenium.webdriver.support.select import Select
    from time import sleep
    
    driver = webdriver.Chrome()
    driver.implicitly_wait(10)
    driver.get('http://www.baidu.com')
    # 鼠标悬停至“设置”链接
    
    driver.find_element_by_link_text('设置').click()
    sleep(1)
    # 打开搜索设置
    
    driver.find_element_by_link_text("搜索设置").click()
    sleep(2)
    # 搜索结果显示条数
    
    sel = driver.find_element_by_xpath("//select[@id='nr']")
    Select(sel).select_by_value('50')  # 显示50条
    # ……
    
    driver.quit()

    Select类用于定位select标签。 select_by_value() 方法用于定位下接选项中的value值。

    13 文件上传   

    对于通过input标签实现的上传功能,可以将其看作是一个输入框,即通过send_keys()指定本地文件路径的方式实现文件上传。

    创建upfile.html文件,代码如下:

    <html>
    <head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    <title>upload_file</title>
    <link href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css" rel="stylesheet" />
    </head>
    <body>
      <div class="row-fluid">
            <div class="span6 well">
            <h3>upload_file</h3>
              <input type="file" name="file" />
            </div>
      </div>
    </body>
    <script src="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.js"></scrip>
    </html>

    通过浏览器打开upfile.html文件,功能如下图。

    接下来通过send_keys()方法来实现文件上传。

    from selenium import webdriver
    import os
    
    driver = webdriver.Firefox()
    file_path = 'file:///' + os.path.abspath('upfile.html')
    driver.get(file_path)
    # 定位上传按钮,添加本地文件
    
    driver.find_element_by_name("file").send_keys('D:\upload_file.txt')
    
    driver.quit() 
    14 cookie操作   

    有时候我们需要验证浏览器中cookie是否正确,因为基于真实cookie的测试是无法通过白盒和集成测试进行的。WebDriver提供了操作Cookie的相关方法,可以读取、添加和删除cookie信息。

    WebDriver操作cookie的方法:

    ·         get_cookies(): 获得所有cookie信息。

    ·         get_cookie(name): 返回字典的key为“name”的cookie信息。

    ·         add_cookie(cookie_dict) : 添加cookie。“cookie_dict”指字典对象,必须有name 和value 值。

    ·         delete_cookie(name,optionsString):删除cookie信息。“name”是要删除的cookie的名称,“optionsString”是该cookie的选项,目前支持的选项包括“路径”,“域”。

    ·         delete_all_cookies(): 删除所有cookie信息。

    下面通过get_cookies()来获取当前浏览器的cookie信息。

    from selenium import webdriver
    
    driver = webdriver.Firefox()
    driver.get("http://www.youdao.com")
    # 获得cookie信息
    
    cookie= driver.get_cookies()
    # 将获得cookie的信息打印
    
    print(cookie)
    
    driver.quit()

    从执行结果可以看出,cookie数据是以字典的形式进行存放的。知道了cookie的存放形式,接下来我们就可以按照这种形式向浏览器中写入cookie信息。

    from selenium import webdriver
    
    driver = webdriver.Firefox()
    driver.get("http://www.youdao.com")
    # 向cookie的name 和value中添加会话信息
    
    driver.add_cookie({'name': 'key-aaaaaaa', 'value': 'value-bbbbbb'})
    # 遍历cookies中的name 和value信息并打印,当然还有上面添加的信息
    
    for cookie in driver.get_cookies():
        print("%s -> %s" % (cookie['name'], cookie['value']))
    
    driver.quit()

    输出结果:

    ======================== RESTART: =========================
    YOUDAO_MOBILE_ACCESS_TYPE -> 1
    _PREF_ANONYUSER__MYTH -> aGFzbG9nZ2VkPXRydWU=
    OUTFOX_SEARCH_USER_ID -> -1046383847@218.17.158.115
    JSESSIONID -> abc7qSE_SBGsVgnVLBvcu
    key-aaaaaaa -> value-bbbbbb

    从执行结果可以看到,最后一条cookie信息是在脚本执行过程中通过add_cookie()方法添加的。通过遍历得到所有的cookie信息,从而找到key为“name”和“value”的特定cookie的value。

    15 调用JavaScript代码   

    虽然WebDriver提供了操作浏览器的前进和后退方法,但对于浏览器滚动条并没有提供相应的操作方法。在这种情况下,就可以借助JavaScript来控制浏览器的滚动条。WebDriver提供了execute_script()方法来执行JavaScript代码。

    用于调整浏览器滚动条位置的JavaScript代码如下:

    <!-- window.scrollTo(左边距,上边距); -->
    window.scrollTo(0,450);

    window.scrollTo()方法用于设置浏览器窗口滚动条的水平和垂直位置。方法的第一个参数表示水平的左间距,第二个参数表示垂直的上边距。其代码如下:

    from selenium import webdriver
    from time import sleep
    
    # 访问百度
    driver=webdriver.Firefox()
    driver.get("http://www.baidu.com")
    
    # 设置浏览器窗口大小
    driver.set_window_size(500, 500)
    
    # 搜索
    driver.find_element_by_id("kw").send_keys("selenium")
    driver.find_element_by_id("su").click()
    sleep(2)
    
    # 通过javascript设置浏览器窗口的滚动条位置
    js="window.scrollTo(100,450);"
    driver.execute_script(js)
    sleep(3)
    
    driver.quit()

    通过浏览器打开百度进行搜索,并且提前通过set_window_size()方法将浏览器窗口设置为固定宽高显示,目的是让窗口出现水平和垂直滚动条。然后通过execute_script()方法执行JavaScripts代码来移动滚动条的位置。 

    16 窗口截图   

    自动化用例是由程序去执行的,因此有时候打印的错误信息并不十分明确。如果在脚本执行出错的时候能对当前窗口截图保存,那么通过图片就可以非常直观地看出出错的原因。WebDriver提供了截图函数get_screenshot_as_file()来截取当前窗口。

    from selenium import webdriver
    from time import sleep
    
    driver = webdriver.Firefox()
    driver.get('http://www.baidu.com')
    
    driver.find_element_by_id('kw').send_keys('selenium')
    driver.find_element_by_id('su').click()
    sleep(2)
    # 截取当前窗口,并指定截图图片的保存位置
    
    driver.get_screenshot_as_file("D:\baidu_img.jpg")
    
    driver.quit()

    脚本运行完成后打开D盘,就可以找到baidu_img.jpg图片文件了。

    17 关闭浏览器   

    在前面的例子中我们一直使用quit()方法,其含义为退出相关的驱动程序和关闭所有窗口。除此之外,WebDriver还提供了close()方法,用来关闭当前窗口。例多窗口的处理,在用例执行的过程中打开了多个窗口,我们想要关闭其中的某个窗口,这时就要用到close()方法进行关闭了。

    ·         close() 关闭单个窗口

    ·         quit() 关闭所有窗口

  • 相关阅读:
    Jsp 中文乱码,解决
    dojox.grid.EnhancedGrid 和 dojox.grid.DataGrid 的继承关系
    使用 Maven 部署 artifact 到 Nexus 教程
    [LeetCode] 187. Repeated DNA Sequences 解题思路
    [LeetCode] 204. Count Primes 解题思路
    [LeetCode] 219. Contains Duplicate II 解题思路
    [LeetCode] 310. Minimum Height Trees 解题思路
    [LeetCode] 200. Number of Islands 解题思路
    PHP7添加mysqli扩展
    MySQL中的锁(表锁、行锁)
  • 原文地址:https://www.cnblogs.com/xiaogongjin/p/11490085.html
Copyright © 2011-2022 走看看