zoukankan      html  css  js  c++  java
  • Python3+Selenium2完整的自动化测试实现之旅(四):Selenium-webdriver操作浏览器、Cookie、鼠标键盘、警示框、设置等待时间、多窗口切换

    本篇学习总结webdriver模块操作浏览器、Cookie、鼠标键盘、警示框、设置等待时间、多窗口切换等方法的使用

    1    浏览器控制

    Selenium-webdriverAPI提供了对页面元素定位和操作方法外,还提供了对浏览器本身的操作,如浏览器前进、后退、刷新、关闭、浏览器窗口大小设置等

    1.1    控制浏览器窗口大小

    Selenium-webdriverAPI对浏览器窗口设置提供了set_window_size(width,height)方法,第一个参数为宽度,第二个参数为高度。如将浏览器窗口设置成移动客户端的大小480*800,脚本为:

    driver. set_window_size(480,800)

    当然一般我们都希望打开浏览器后最大化窗口,Selenium-webdriverAPI也提供了窗口最大化的方法

    maximize_window()

    1.2    控制浏览器前进、后退、关闭

    有时我们经常操作浏览器页面前进、后退以及关闭等操作,Selenium-webdriverAPI提供了对应的forword()、back()、quit()、close()方法

    其中quit()、close()方法,不同的是quit()方法表示退出整个浏览器驱动,close()表示退出当前的浏览器窗口

    1.3    刷新浏览器

    Selenium-webdriverAPI提供刷新浏览器页面的方法为refresh()

      具体的各个方法使用,如下面新建的browser.py脚本实例:

     

     1 '''
     2   Code description:
     3   Create time:
     4   Developer:
     5 '''
     6 # -*- coding: utf-8 -*-
     7 from selenium import webdriver
     8 import time
     9 driver = webdriver.Ie()
    10 driver.get('https://www.baidu.com')
    11 driver.maximize_window()             # 最大化窗口
    12 time.sleep(5)
    13 driver.set_window_size(480,800)      # 设置窗口大小
    14 driver.back()                        # 浏览器后退
    15 driver.forward()                     # 浏览器前进
    16 time.sleep(5)
    17 driver.refresh()                     # 浏览器刷新
    18 driver.quit()                        # 浏览器退出
    19 # driver.close()                       # 关闭当前打开的浏览器页面

    2      操作浏览器cookie

    Webdriver提供了多种操作浏览器cookie的方法,主要如下:

                get_cookies()

    该方法会获取浏览器所有的cookie信息,cookie信息数据类型以字典的形式存放,即key-value对的形式

               get_cookie(name)

      该方法会获取cookie数据中属性键值name的值的cookie信息,其他键值数据信息不获取

              add_cookie(cookie_dict)

    该方法为添加cookie,由于我们知道cookie存放数据是以字典的形式,故添加cookie时必须是键值对形式

             delete_cookie(cookie_dict)

    该方法为删除cookie,与add对应

            delete_all_cookies()

    该方法为删除所有的浏览器cookie信息

    具体方法使用如下图,新建cookie.py的脚本,还是以baidu.com为例子

     1 '''
     2   Code description:
     3   Create time:
     4   Developer:
     5 '''
     6 # -*- coding: utf-8 -*-
     7 from selenium import webdriver
     8 driver = webdriver.Ie()
     9 driver.get('https://www.baidu.com/')
    10 cookie = driver.get_cookies()                # 获取所有的cookie,cookie数据以字典的形式存放
    11 print(cookie)
    12 print(driver.get_cookie('BAIDUID'))          # get_cookie(name)方法用来获取cookie键值name对应的值
    13 driver.add_cookie({'name': 'hello','value' : 'world'})  # 添加cookie
    14 for cookie in driver.get_cookies():
    15     print(driver.get_cookie('hello'))
    16 driver.delete_cookie('hello')                # 删除指定的cookie
    17 # driver.delete_all_cookies()                  # 删除所有的cookie
    18 driver.quit()

    3      鼠标和键盘控制

    在浏览网页是电脑和我们交互的就是鼠标和键盘了,也是我们操作最多的。鼠标在现在的网页上已经有诸多操作,如单击、右击、双击、悬浮、拖拽等操作;键盘用于输入,有诸多输入键,如enter、backspace、空格等以及诸多组合键的使用。Webdriver对于鼠标和键盘也实现了比较多和详细的模拟实现方式,主要由webdriver中封装的ActionChains类实现。

    3.1    模拟鼠标操作

    对于鼠标的操作,ActionChains类主要提供了鼠标的右键、双击、悬浮、拖拽等方法

    具体的方法如下:

    1. 右击:context_click()
    2. 双击:double_click()
    3. 悬浮:move_to_element()
    4. 拖拽:drag_and_drop()

    下面以百度网盘网页客户端来说明模拟鼠标的这些操作方法,如下图选中一个文件夹后可以鼠标右键后有操作列表显示:

    模拟实现鼠标右键操作来打开该文件夹,代码如下:

     1 '''
     2   Code description:
     3   Create time:
     4   Developer:
     5 '''
     6 # -*- coding: utf-8 -*-
     7 from selenium import webdriver
     8 from selenium.webdriver.common.action_chains import ActionChains
     9 driver = webdriver.Ie()
    10 driver.get('https://pan.baidu.com')
    11 '''
    12 中间省略百度网盘的登陆过程脚本
    13 '''
    14 #  定位到PyCharm这个元素位置
    15 PyCharm = driver.find_element_by_xpath('//*[@id="layoutMain"]/div/div[2]/div/div[3]/div/div/dd/div[2]/div[1]')
    16 ActionChains(driver).context_click(PyCharm).perform()
    17 '''
    18 调用ActionChains()方法,传入driver浏览器参数,类提供的鼠标右击操作方法context_click(),传入需要右击的元素PyCharm,最后
    19 perform()方法为整个右击动作的提交
    20 '''
    21 driver.quit()

    同样,上面的PyCharm文件夹,我们也可以双击鼠标来打开该文件,双击操作如下:

    ActionChains(driver).double_click(PyCharm).perform()

    鼠标悬浮操作,如将鼠标移动到网盘的账号处,会显示该账号的信息,如下图:

    实现方法为move_to_element()如下:

    user = driver.find_element_by_xpath('//*[@id="layoutHeader"]/div/div/dl/dd[2]/span')  # 定位到网盘账户位置
    ActionChains(driver).move_to_element(user).perform()

    鼠标拖拽操作的没找到合适的网站,使用方法大致如下:

    pesition1 = driver.find_element_by_xpath('//*[@id="layoutHeader"]')  # 定位元素A的位置
    pesition2 = driver.find_element_by_xpath('//*[@id="layoutHeader"]/div/div/dl/dd[2]/span')  # 定位元素B的位置
    ActionChains(driver).drag_and_drop(pesition1,pesition2).perform()     # 进行拖拽操作

    拖拽方法为drag_and_drop(参数1,参数2),参数1为定位到的需要拖拽的元素,参数2为定位到拖拽后的位置

    3.2   模拟键盘操作

    之前我们已经使用过键盘输入的方法send_keys(),但是如果我们需要操作更多的键如回车、回格,ctrl、shift以及各种组合键,这时我们需要引入webdriver下面提供的keys类模块。

    常用的键盘操作有:enter、backspace、ctrl+c、ctrl+v、F5等,keys模块都是有方法的

    如模拟backspace键,打开百度,输入Python3,然后在Backspace去掉3这个数字,再百度搜索:

     1 '''
     2   Code description:
     3   Create time:
     4   Developer:
     5 '''
     6 # -*- coding: utf-8 -*-
     7 from selenium import webdriver
     8 from selenium.webdriver.common.keys import Keys
     9 driver = webdriver.Ie()
    10 driver.get('https://www.baidu.com/')
    11 baidu = driver.find_element_by_id('kw')  # 定位到百度搜索框
    12 baidu.send_keys('Python3')
    13 baidu.send_keys(Keys.BACK_SPACE)      # 使用Keys.BACK_SPACE来模拟Backspace键其它

    其它操作键盘的方法就不列举了,可以自己练习下,在导入Keys模块后就可以调用模块下所有封装好的方法:
     

    4      警告框处理

       现在几乎很多软件都会嵌入各种警示框,比如登陆验证出错会弹出警示框。对于这些弹出的警示框,webdriver也是提供了专门的方法,来处理这类软件警示框。

    Webdriver通过switch_to.alert()方法来定位到警示框,并提供了如下对警示框的操作方法:

    1. 获取警示框文本信息:text
    2. 点击确认:accapt()
    3. 取消确认:dismiss()
    4. 输入值,如果警示框有提供输入框:send_keys()

    比如如下一个登录页面,当输入不对的账号或者密码时,会弹出警示框

    下面看看这些处理警示框的方法使用:

    username = driver.find_element_by_id('loginUserName')
    username.send_keys('123')
    password = driver.find_element_by_id('loginPassWord')
    password.send_keys('123')
    button_login = driver.find_element_by_id('loginBtn')
    button_login.click()
    alter = driver.switch_to_alert()    # 获取警示框
    alter.text                     # 获取警示框文本信息
    alter.accept()                 # 确认警示框
    alter.dismiss()                # 取消确认
    alter.send_keys()              # 输入值,如果警示框有输入框

    注意selenium现在的方法为:switch_to.alert()

    5      多窗口切换

    有时我们需要打开多个浏览器窗口进行窗口切换,操作不同窗口,由于selenium-webdrvier只能在一个窗口中识别元素和对元素进行操作,如果想要操作另外一个窗口,就必须进行窗口切换。对此,webdriver也提供了这种多窗口切换的场景的实现方法。由于每个打开的窗口句柄是不同的,这样webdriver通过窗口句柄实现窗口切换。具体方法如下:

    1. current_window_handle      获取当前窗口句柄
    2. window_handle             返回所有打开窗口的句柄,返回的结果是一个列表
    3. switch_to.window(handle)     切换到指定窗口,参数handle为指定窗口的句柄

    如下脚本以登录百度首页,并打开另一个窗口进入到注册页面,然后却换窗口到百度首页,进行搜索为例说明以上方法使用:

     1 '''
     2   Code description:
     3   Create time:
     4   Developer:
     5 '''
     6 # -*- coding: utf-8 -*-
     7 from selenium import webdriver
     8 driver = webdriver.Ie()
     9 driver.get('https://www.baidu.com/')
    10 driver.maximize_window()
    11 sreach_windows = driver.current_window_handle    # 获取当前百度搜索窗口的句柄,是一个字符串
    12 print(sreach_windows)
    13 driver.find_element_by_link_text(u'登录').click()
    14 driver.find_element_by_link_text(u'立即注册').click()
    15 all_handles = driver.window_handles                  # 得到搜索页面和注册页面所有的窗口句柄,返回的是一个列表
    16 print(all_handles)
    17 # 进入到注册窗口
    18 for handle in all_handles:
    19     if handle != sreach_windows:
    20         driver.switch_to.window(handle)          # 切换到指定窗口
    21         print("现在进入的是注册窗口")
    22         driver.find_element_by_name('userName').send_keys('123')
    23 # 切换到搜索窗口
    24 for handle in all_handles:
    25     if handle == sreach_windows:
    26         driver.switch_to.window(handle)          # 切换到指定窗口
    27         print("现在进入的是搜索窗口")
    28         driver.find_element_by_id('TANGRAM__PSP_4__closeBtn').click()  # 关闭注册窗口
    29         driver.find_element_by_id('kw').send_keys('python')
    30         driver.find_element_by_id('su').click()
    31         

    6      设置等待时间

    在测试过程中,我们编写的脚本往往很快执行完成,为了观察一些重要步骤的执行效果,我们可以在脚本中添加执行等待时间或者我们需要定位的元素页面短时间没法加载出来时,此时如果没有设置等待时间,脚本执行就会出错:元素不存在,这时我们设置等待时间就非常有必要了。对此,selenium-webdriver提供了Explicit Waits(显示等待)和Implicit Waits(隐性等待)两种模式的等待时间设置,另外python标准库模块time也提供了一种非智能的sleep()等待时间模式。

    6.1    强制等待

    Python标准库模块time提供强制等待设置,方法为sleep(),就是脚本执行过程中设置强制暂停脚本运行的时间间隔

    6.2    隐性等待

    设置隐性等待时间,由webdriver提供。隐性等待时间就是设置一个时间范围,有个最大响应时间,超时将会抛出异常。如下脚本,驱动打开IE浏览器,我们设置了最大打开等待时间是10s,也就是说可能2s时ie就开启,如果超过10s就会抛出异常。使用方法为:

    driver.implicitly_wait(10)

    6.3    显示等待

    设置显示等待时间,由webdriver下的WebDriverWait模块提供。WebDriverWait()会配合until()和until_not()方法一起使用,根据判断条件而进行灵活进行处理时间等待问题,他会不断的根据你设定的条件去判断,直到超过你设置的等待时间,如果设置的条件满足,然后进行下一步操作,如果没有满足会报一个'selenium.common.exceptions.TimeoutException: Message: '错误。

    如下脚本设置用户名输入框显示等待时间,并轮训判断该元素是否存在,如果判断在设置时间内没有则抛出异常:,如下使用方式:

  • 相关阅读:
    VirtualBox中的Linux读取Windows共享目录
    Windows10资源管理器去掉左侧“下载、文档、图片、音乐、视频”等目录
    在Eclipse ee中成功使用jQuery UI插件
    (medium)LeetCode .Implement Trie (Prefix Tree)
    (*medium)LeetCode 211.Add and Search Word
    (easy)LeetCode 257.Binary Tree Paths
    2016 360笔试 编程题 2
    2016 360笔试 编程题1
    (番外)使用DFS和BFS实现拓扑排序
    (medium)LeetCode 210.Course Schedule II
  • 原文地址:https://www.cnblogs.com/tdp0108/p/10469734.html
Copyright © 2011-2022 走看看