• 【笔记】软件测试06——Web自动化


    阅读:

    石墨文档

    七、web自动化测试

    GUI自动化测试学习内容:

    1. 了解自动化测试的相关概念
    1. 掌握Selenium Webdriver常用API
    1. 掌握自动化测试中的元素定位方法
    1. 掌握自动化测试中的元素操作
    1. 掌握自动化测试断言操作
    1. 掌握unittes框架的基本应用及自动化管理

    一)自动化测试的相关概念

    什么是自动化测试?

    自动化测试就是把人对软件的测试行为转化由机器执行测试行为的一种实践。对于最常见的GUI自动化测试来讲,就是由自动化测试模拟之前那需要人工在软件界面上的各种操作,并且自动验证其结果是否符合预期结果。

    自动化测试是否会把测试工程师淘汰?

    从分析——计划——设计——实现——执行这个流程中,分析、计划、设计是需要人工进行的,实现、执行的过程中,也有自动化无法满足要求的情况。

    什么样的项目适合自动化?

    1. 需求文档、不会频繁变更
    1. 研发和维护周期长,需要频繁执行回归测试
    1. 需要在多种平台上重复运行相同测试的场景
    1. 性能、兼容性通过手工测试无法实现,或者手工测试成本太高
    1. 被测软件的开发较为规范,能够保证系统的可测试性
    1. 测试人员具备一定的编程能力

    1)自动化测试的类型分类

    自动化测试有广义和狭义之分:

    1. 广义:借助工具进行软件测试都可以成为自动化测试
    1. 狭义:主要指基于UI层的自动化测试

    测试划分:功能、性能、安全

    测试阶段划分:基于代码的单元测试、集成阶段的接口测试、系统测试阶段的UI自动化

    2)自动化测试用例设计原则

    自动化测试用例设计原则:

    1. 自动化测试一般集中在需要重复测试的基本功能、基本业务流以及正向路径操作,不要将复杂的异常测试、复杂业务流程操作等加入到自动化测试用例中
    1. 自动化测试用例应尽量保持用例之间的独立性,最好不要形成依赖关系
    1. 自动化测试如果对数据进行了修改,在测试结束后应尽量保持还原,避免对其他用例执行产生影响
    1. 每个自动化测试用例只能验证一个功能点

    二)webdriver

    1)webdriver环境配置

    什么是Selenium webdriver?

    Se:硒

    1. 一种开源、免费的自动化测试工具,目前80%以上的公司都在使用它进行自动化测试
    1. 多浏览器支持:Firefox、Chrome、IE、Opera
    1. 多平台支持:Java、Python、Ruby、php、C#,JavaScript
    1. 简单(API简单),灵活(用开发语言驱动)

    01环境配置

    1. 通过pip install selenium安装最新的selenium
    2. 下载对应的chromedriver或geckodriver,并将driver房到环境变量路径中

    Chromedriver下载镜像:

    CNPM Binaries Mirror

    geckodriver下载镜像(firefox):

    http://npm.taobao.org/mirrors/geckodriver/

      3.在pycharm中导入webdriver即可使用

    from selenium import webdriver

    02 webdriver的工作原理

     

    即编写脚本通过http请求发送relful请求,如:find_ element_ by_ class_ name ,脚本通过driver. exe驱动server 服务器,创建session, 绑定ip,向浏览器进行发送操作,并返回响应结果。

    2 )自动化测试的基本操作

    01自功化测试的基本操作示例

    LOVE四步法:

    eg

     

    02 webriver常用API -浏览器操作

    1. 打开: driver. get(URL)
    2. 关闭:driver.quit()结束进程或driver.close()仅关闭当前窗口
    3. 设置窗口大小:driver.set_window_size(200, 500)
    4. 最大化窗口:driver.maxmize_window()
    5. 获取网页资源:driver.page_source
    6. 获取窗口名称:driver.name
    7. 刷新页面:driver.refresh()
    8. 获取页面标题:driver.title
    9. 获取当前页面的url地址:driver.curret_url
    10. 获取当前页面截图:driver.get_screenshot_as_file(path)

    03 web常用定位方式

    webdriver常用API——常用的八种定位方式:

    1. id(不重复)
    2. name(有可能重复)
    3. class name(特指具有class属性的元素)
    4. tag name
    5. link text
    6. partial link text
    7. xpath(万能,可在chrome中用$x调试)
    8. css selector(万能,可以在chrome中用$$调试)

    格式:

    1. from selenium import webdriver
    2. driver = webdriver.Chrome()
    3. #id定位
    4. name = driver.find_element('id', 'username')
    5. name.send_keys('教育')
    6. #name属性定位
    7. driver.find_element('name', 'sex').click()  # 选中性别中男这个选项   返回找到的第一个值
    8. driver.find_elements('name', 'sex')[1].click()  # find_elements将以列表形式返回多个符合条件的元素,返回列表的第二个,列表从0下标开始
    9. #class name属性定位
    10. driver.find_element('class name', 'dotborder').send_keys('凡云教育')
    11. #对于复合样式的元素,不能直接使用class name方法来进行定位,以下语句报错
    12. driver.find_element('class name', 'dotborder border').send_keys('aaaaa')
    13. #tag name定位:一般用于寻找同类元素,返回列表
    14. elements = driver.find_elements('tag name', 'input')
    15. print(len(elements))
    16. #link text和partial link text专门用于定位超链接a标签。
    17. driver.find_element('link text', '打开百度').click()  #全匹配
    18. driver.find_element('partial link text', '百度').click()#部分匹配
    19. #xpath定位
    20. #绝对路径定位法
    21. print(driver.find_element('xpath', '/html/body/form'))
    22. #相对路径定位法
    23. print(driver.find_element('xpath', '//tbody/tr[3]/td[2]/i').text)
    24. print(driver.find_element('xpath', '//tbody/tr[3]//i').text)
    25. #xpath属性定位
    26. print(driver.find_element('xpath', "//input[@type='file']"))
    27. driver.find_element('xpath', "//input[@type='text'][@mode='sub']").send_keys('18')
    28. # xpath模糊定位
    29. print(driver.find_element('xpath', "//*[contains(text(), '60岁')]").text)
    30. driver.find_element('xpath', "//textarea[contains(@placeholder, 'yourself')]").send_keys('hello,教育')

     

    find_element和find_elements

    对于查找元素的方法,在webdriver中四种不同的写法,请注意区别:

    1. find_element('xx','selector')根据指定的方式定位元素,仅返回找到的第一个元素,如果美有元素符合则直接抛出异常
    2. find_elements('xx','selector')根据指定的方式定位元素,以列表形式返回找到的所有元素,如果没有元素符合则返回空列表
    3. find_element_by_xx('selector')根据指定的方式定位元素,仅返回找到的第一个元素,如果美有元素符合则直接抛出异常
    4. find_elements_by_xx('selector')根据指定的方式定位元素,以列表形式返回找到的所有元素,如果没有元素符合则返回空列表

    三)Selenium+webdriver操作

    1)Selenium元素查找

    01、基本元素

    1. id:find_element('id','selector')
    2. name:find_element('name','selector')
    3. class name:find_elemnet('class name','selector')
    4. tag name:find_elementfind_elements('tag name','selector')

    使用无痕窗口,因为没有任何cookie,代码打开的浏览器就是没有的,所以定位元素的时候,使用无痕窗口打开。

    find_element和find_elements

    对于查找元素的方法,在webdriver中四种不同的写法,请注意区别:

    1. find_element('xx','selector')根据指定的方式定位元素,仅返回找到的第一个元素,如果美有元素符合则直接抛出异常
    2. find_elements('xx','selector')根据指定的方式定位元素,以列表形式返回找到的所有元素,如果没有元素符合则返回空列表
    3. find_element_by_xx('selector')根据指定的方式定位元素,仅返回找到的第一个元素,如果美有元素符合则直接抛出异常
    4. find_elements_by_xx('selector')根据指定的方式定位元素,以列表形式返回找到的所有元素,如果没有元素符合则返回空列表

    eg:

    对于一段html

    <input id="username_id" type="text" name="username" class="red">

    如下代码都可以获取到这个标签:

    1. #id
    2. driver.find_element_by_id("username_id")
    3. #name
    4. driver.find_elemenet_by_name("username")
    5. #class_name
    6. driver.find_element_by_class_name("red")
    7. #tag
    8. driver.find_element_by_tag_name("input")

    实例:

    1. from selenium import webdriver
    2. from time import sleep
    3. driver=webdriver.Chrome()
    4. url = 'https://www.baidu.com'
    5. #使用浏览器打开指定页面
    6. driver.get(url)
    7. #id  查找元素(标签、标记、节点)
    8. driver.find_element("id","kw").send_keys("肖战王一博")
    9. driver.find_element("id","su").click()
    10. #name
    11. driver.find_element("name","wd").send_keys("肖战王一博")
    12. driver.find_element("id","su").click()
    13. #class_name
    14. driver.find_element("class name","s_ipt").send_keys("肖战王一博")
    15. driver.find_element("id","su").click()
    16. sleep(3)
    17. #关闭浏览器
    18. driver.quit()

    复合样式不能用class去定位,直接报错,可以使用css selector进行定位

     

    02、超链接(a标签)

    • link text
    • partial link text

    1. 超链接的例子

    对于一段html

    "http://www.baidu.com" id = "fwA" target="_blank">访问 百度 网站

    如下代码都可以获取到这个标签

    1. #link_text
    2. driver.find_element("link text","访问 百度 网站")
    3. #partial_link_text
    4. driver.find_element("partial link text","访问")

    注意:

    如果相同的规则回队应多个标签,那么这些方法会返回第一个

    实际例子:

     

    1. #定位a标签
    2. #link_text
    3. driver.find_element("link text","hao123").click()
    4. #partial_link_text  如果文本比较长 ,定位部分可以使用这个,能够完整尽量完整
    5. driver.find_element("partial link text","hao12").click()

    03、css选择器

    web页面元素:

    1、HTML页面基本结构

    1.   html文档头部区域,页面不可见
    2. html文档内容区域,页面可见

    2、常见的页面元素:

    1. 容器型元素:div、form、table
    2. 页面元素:link、img、input(button、text、file)、select、checkbox、radio、textarea、submit

    css选择器语法:

    选择器

    例子

    例子描述

    .class

    .intro

    选择class="intro"的所有元素

    #id

    #firstname

    选择id="firstname"的所有元素

    *

    *

    选择所有元素

    element

    p

    选择所有

    元素

    element,element

    div,p

    选择所有

    元素和所有

    元素

    element element

    div p

    选择

    元素内部的所有

    元素

    element>element

    div>p

    选择父元素为

    元素的所有

    元素

    element+element

    div+p

    选择紧接在

    元素之后的所有

    元素

    [attribute]

    [tartget]

    选择带有target属性所有元素

    [attribute=value]

    [target=_nlank]

    选择target="_bklank"的所有元素

    参考:

    selenium:css_selector定位详解 - 也许明天 - 博客园

    方法:

    1. 利用元素的标签、元素的单一属性定位(id、class)等
    2. 多属性定位
    3. 标签+属性组合
    4. 层级(子孙)定位

    方法:

    1. find_element_by_css_selector(CSS选择器)
    2. #new:
    3. find_element('css selector','css选择器')

     eg:

    以上的百度搜索框

    1. #id
    2. find_element_by_css_selector("#kw").send_keys("博君一肖")
    3. #  . : class
    4. find_element_by_css_selector(".s_ipt").send_keys("博君一肖")
    5. #name
    6. find_element_by_css_selector("[name=wd]").send_keys("博君一肖")
    7. #value
    8. find_element_by_css_selector("[value=百度一下]").click()
    9. #多属性定位,以下返回的是列表
    10. driver.find_element('css selector','[type="checkbox"][name="hobby"]')[2].click()
    11. #利用父子关系来定位目标元素,父元素>第一个子元素,nth-child指定子元素,序号从1开始
    12. deriver.find_element('css selector','tbody>tr:nth-child(1)>td:nth-child(2)>input')
    13. #父子关系(>)孙子关系(空格)
    14. driver.find_element('css selector','tbody>tr:nth-child(3) i')
    15. #模糊匹配*=
    16. driver.find_element('css selector','input[value*="测试2"]').click()

     eg:

    1. from time import sleep
    2. from selenium import webdriver
    3. driver = webdriver.Chrome()
    4. driver.get('https://www.baidu.com/')
    5. #找class=s_ipt
    6. driver.find_element('css selector','.s_ipt').send_keys('博肖希望小学')
    7. driver.find_element('css selector','#su').click()
    8. sleep(1)
    9. driver.quit()

    复合样式不能用class去定位,直接报错,可以使用css selector进行定位

     

    driver.find_element('css selector','.dotborder.border')

    F12的console

     

    04、元素定位Xpath

    1. Xpath概念

    xpath = xml path

            XML和HTML一样是标签语言,通过标签的嵌套来表达信息,自然而言,形参了父节点、子节点、后代节点、同胞节点等关系。而xpath就是用来在这些节点中找到所需要的

    XML: 可扩展标记语言

    HTML:超文本标记语言

    Xpath语法

    绝对路径和相对路径

    1. 绝对路径表示法:指从/目录开始的绝对的路径表示法,必须根据实际路径逐级表示(从根目录开始,即从标签开始)
    2. 相对路径表示法:指从目标对象所在位置根据其父对象进行路径表示的方法

    1. xpath表达式

    完整:

    表达式

    描述

    nodename

    选区此节点的所有子节点

    /

    从根节点选取

    //

    从匹配选择的当前节点选择文档中的节点

    .

    选区当前节点

    ..

    选区当前节点的父节点

    1. 获取内容

    表达式

    描述

    @

    选取属性

    text()

    获取文本

    1. 进阶表达式

    路径表达式

    结果

    /bookstore/book[1]

    选取属于bookstore子元素的第一个book元素

    /bookstore/book[last()]

    选取属于bookstore子元素的最后一个book元素

    /bookstore/book[last()-1]

    选取属于bookstore子元素的倒数第二个book元素

    //book/title[text()='Harry Potter']

    选择所有book下的title元素,仅仅选择文本为Harry Potter的title元素

    //title[@lang="eng"]

    选择lang属性值为eng的所有title元素

    1. 实践使用方法
    2. 通过Chrome的调试工具,获得特定元素的xpath
    3. 修改得到的xpath表达式
    • 通过chrome的xpath herper扩展插件,匹配查看
    • F12的console

     

    实例:

    还是百度的例子

    1. #通过xpath的方式定位 
    2. driver.find_element("xpath","//*[@id='kw']").send_keys("博君一肖")
    3. driver.find_element("xpath","//*[@id='su']").click()
    4. #xpath定位
    5. #绝对路径定位法
    6. print(driver.find_element('xpath', '/html/body/form'))
    7. #相对路径定位法。必须以"//"开头
    8. print(driver.find_element('xpath', '//tbody/tr[3]/td[2]/i').text)
    9. #简化,tr下只有一个i元素,不管i是哪一级,注意前面是“//”
    10. print(driver.find_element('xpath', '//tbody/tr[3]//i').text)
    11. #xpath属性定位 ,input标签这种的type='file'
    12. print(driver.find_element('xpath', "//input[@type='file']"))
    13. #多属性
    14. driver.find_element('xpath', "//input[@type='text'][@mode='sub']").send_keys('18')
    15. # xpath模糊定位,根据关键词查找不能等于
    16. print(driver.find_element('xpath', "//*[contains(text(), '60岁')]").text)
    17. driver.find_element('xpath', "//textarea[contains(@placeholder, 'yourself')]").send_keys('hello,教育')

     

    05、元素操作

    1. clear()  清除文本
    2. send_keys()   模拟输入
    3. click()    单击元素

    eg:

    1. driver.find_elemnet("id","kw").send_keys("肖战")
    2. time.sleep(3)
    3. driver.find_element("id",""kw").clear()
    4. time.sleep(3)
    5. driver.find_element("id",""kw").send_keys("王一博")
    6. driver.find_element("id",""su").click()

    1. 元素属性获取

    1. size       返回元素大小
    2. text       获取元素的文本
    3. get_attribute()    获取属性值
    4. is_display()    判断元素是否可见
    5. is_enabled()   判断元素是否可用

    eg:

    1. print(driver.find_element("id",""kw").size)
    2. print(driver.find_element("id",""kw").text)
    3. print(driver.find_element("id",""kw").is_enable())
    4. print(driver.find_element("id",""kw").is_display())
    5. driver.find_element("xpath",""//*[text()='新闻']").get_attribute("herf")

    01获取元素指定属性的值

    driver.find_element_by_id('username').get_attribute('value')

    02复选框常见操作

    1. #判断是否可见
    2. print(driver.find_element_by_id('kw').is_displayed())
    3. #判断是否可用
    4. print(driver.find_element_by_id('kw').is_enable())
    5. #判断是否已经被选中,如果选择则返回True,否则返回false
    6. print(driver.find_element_by_id('kw').is_selected())

    03发送复合按键

    1. #shift+字母小写实现大写输入,需要进行复合按键来操作下,模拟人操作键盘
    2. from selenium.webdriver.common.keys import Keys  #Keys可以帮助使用复合按键
    3. driver.find_element().send_keys(Keys.SHIFT,'bx'*50#输入的值大写和小写都可以,*50:输入该值50个

    04下拉列表常见操作

    1. from selenium.webdriver.support.ui import Select
    2. Select(driver.find_element_by_id('status')).select_by_index(3) #选择的序号,下标从0开始
    3. Select(driver.find_element_by_id('status')).select_by_visible_text('Ongoing') #根据文本进行选择
    4. Select(driver.find_element_by_id('status')).select_by_value('sh'#便签里面的value=''的值

    05实战

    1. from selenium import webdriver
    2. #from time import sleep
    3. import time
    4. driver.get('https://www.woniuxy.com')
    5. driver.maximize_window()  # 窗口最大化,确保登陆按钮显示在界面上
    6. driver.find_element('link text', '登录').click()
    7. driver.find_element('id', 'l_tel').send_keys('15828183448')
    8. driver.find_element('id', 'l_pass').send_keys(pwd)
    9. time.sleep(10)
    10. driver.find_element('id', 'loginButton').click()
    11. driver.execute_script("window.scrollTo(0, 300);")
    12. time.sleep(1)
    13. driver.find_element('link text', '付费专属').click()
    14. driver.find_element('link text', '查看更多').click()
    15. Select(driver.find_element('id', 'area')).select_by_visible_text('凡云教育')
    16. courses = driver.find_elements('class name', 'course-name')
    17. for course in courses:
    18.     if course.text.strip():
    19.         print(course.text)

    06、元素定位的常规原则

    01元素定位方式选择:

    1. 页面有id时,优先使用id来定位,其次是name
    2. Xpath很强悍,但定位性能不是很好,当其他方法不好定位时可以用
    3. 定位一组相同元素时,可以考虑使用tag name或name
    4. 定位连接时,可考虑link text或partial link text

    02定位元素的注意事项

    1. 找到待定位元素的唯一属性
    2. 如果该元素没有唯一属性,则先找到能被唯一定位到的父元素/子元素/相邻元素,再使用xpath或css选择器等进行基于位置的定位
    3. 不要使用随机唯一属性定位
    4. 最重要的时多与研发沟通,尽量把关键元素加上id或name,并减少不合理的页面元素,例如重复id,此类事情最好不要发生

    2)浏览器的基本操作

    浏览器操作(方法)

    1. maximize_window()     最大化浏览器
    2. set_window_size(width,height)   设置浏览器宽、高像素点
    3. set_window_position(x,y)  设置浏览器位置,浏览器左上角相对于屏幕左上角位置
    4. send.keys()   向文本域或文件上传按钮发送文字内容
    5. back()  后退
    6. clear()  清除按钮
    7. click()  点击按钮
    8. forword()   前进
    9. refresh()   刷线
    10. close()   关闭当前页面
    11. quit()     关闭浏览器

    浏览器信息(属性)

    1. title  获取页面title
    2. text  获取节点上的文本信息,标签中间的值可获得
    3. current_url()   获取当前页面URL
    4. is_displayed()    判断是否显示出来,返回布尔值,用于判断
    5. get_attribute('属性')   获取指定属性的值,可获取文本框输入的值

    eg:

    1. print(driver.title)
    2. print(driver.current_url())
    3. print(driver.find_element('id','kw').get_attribute('class'))
    4. #最大化
    5. driver.maximize_window()
    6. #设置浏览器
    7. time.sleep(1)
    8. driver.set_window_size(800,600)
    9. time.sleep(3)
    10. driver.set_window_position(200,200)
    11. driver.find_element("id","kw").send_keys("bjyx")
    12. driver.find_element("id","su").click()
    13. sleep(2)
    14. driver.back()
    15. time.sleep(2)
    16. driver.forword()
    17. time.sleep()
    18. driver.refresh()
    19. time.sleep(2)
    20. driver.back()
    21. driver.find_element("xpath","//*[text()='hao123']").click()
    22. time.sleep(2)
    23. driver.close()
    24. time.sleep(2)
    25. driver.quit()

    3)页面等待

    1. 为什么要等待

            因为web中看到的元素,不一定是写在html代码中的,有可能是通过javascript代码的demo来操作产生出来的。而js产生元素,很可能先要去获取到数据,处理后再去显示的。所以:不一定网页打开,所有元素都在页面中了。如果马上去找,可能会出错。

    代码执行速度远远快于页面加载的速度,翻页的时候需要进行页面等待。

    等待方式:

    1. 显示等待
    2. 隐式等待
    3. 强制等待

    1. 显式等待

    可针对每一个元素进行单独设置,等待条件更加灵活。针对某一些元素来执行等待,等待显示。

    注意:如果显式等待和隐式等待同时设置,以最长等待时间为准

    1. 如何操作:
      • 使用webdriverWait包装webDriver对象
      • 使用webdriver的utill方法,传入可调用对象(通常是presence_of_element_location函数的返回值)
    1. 需导入包
    1. from selenuim.webdriver.support import expected_conditions as EC
    2. from selenium.webdriver.support.wait import webDriverwait

    常见的EC方法:

    1. title_is(strtitle):判断当前页面的title是否精确等于预期
    2. title_contains(strtitle):判断当前页面title是否包含指定字符串
    3. presence_of_element_located(locator):判断某个元素是否被加载到dom树(html代码)里,并不代表元素一定可见
    4. visibility_of_element_located(locator):判断某个元素是否可见,可见代表元素非隐藏,并且元素的宽和高都不等于0
    5. inivisibility_of_element_located(locator):判断某个元素是否不可见
    6. element_to_clickable(locator):判断某个元素中是否可见并且enable的,这样才叫clickable
    7. text_to_be_present_in_element(locator):判断某个元素中的text是否包含了预期的字符串

      • 显式等待eg:
    1. from selenium import webdriver
    2. from selenium.webdriver.common.by import By
    3. from selenuim.webdriver.support import expected_conditions as EC
    4. from selenium.webdriver.support.wait import webDriverwait
    5. url = 'https://www.baidu.com'
    6. driver = wevdriver.Chrome()
    7. driver.get(url)
    8. #输入框输入要搜索的内容   博肖
    9. driver.find_element("id","kw").send_kesys("博肖")
    10. #点击 百度一下
    11. driver.find_element("id","su").click()
    12. #显式等待,导包太多了
    13. #EC期待等待的时间   等待某个元素加载完成,每个0.5秒去检测一次,最多等待5秒  ID为1的元素
    14. element = webDriverWait(driver,5).
    15.   until(EC.presence_of_location((By.ID,'1')))
    16. #element.sen_keys("admin")
    17. #点击一个搜索到的条目
    18. driber.find_elemenet("id","1").click()
    19. sleep(3)
    20. #关闭浏览器
    21. driver.quit()
    22. eg2:
    23. #5代表最多等待5秒,等待id为msg的元素值的参数出现
    24. webDriverWait(driver,5).until(EC.text_to_be_present_in_element('text','msg'),'出错啦:找不到该用户名...')
    25. #element_to_clickable
    26. webDriverWait(driver,10).until(EC.element_to_clickable(('id','btn3'))
    27. #inivisibility_of_element_located,如果是不可见的则报错,invisibility是不可见
    28. webDriverWait(driver,5).until(EC.visibility_of_element_located(('id','btn2')))
    29. #presence_of_element_located
    30. webDriverWait(driver.5).until(EC.presence_of_element_located(('id','btn2')))

    显示等待比较灵活,比较麻烦。

    若是以后遇到没有找到元素等的问题,可以考虑下是否是没有等待时间。

    2.隐式等待

    即全局等待

            设置依次后(隐式等待只需设置一次),全局有效,在元素没有出现时最多只等待指定时间,但如果再等待时间内,什么时候元素出现什么时候停止等待。

            隐式等待只能等待元素生成,当这个元素不存在时就会等定位元素,但当元素存在时则不会等待。当有时侯等的不是元素存不存在,而是等待元素显示的文字,文字还没有生成,则无法获取(这个时候可以使用强制等待)。

            隐式等待只能在元素不存在这种情况才能生效,否则不会产生任何等待效果。

    implicitly_wait(5)

            给浏览器加入了一个默认的设置,在每一次操作这个元素,若没有获取到该元素,则会等待设置的时间,如果找到了则继续,否则抛出元素未找到异常。

    eg:  推荐

    1. from selenium import webdriver
    2. url = 'https://www.baidu.com'
    3. driver = wevdriver.Chrome()
    4. driver.get(url)
    5. #输入框输入要搜索的内容   博肖
    6. driver.find_element("id","kw").send_kesys("博肖")
    7. #点击 百度一下
    8. driver.find_element("id","su").click()
    9. #隐式等待  implicitly隐含
    10. driver.implicitly_wait(5)
    11. #点击一个搜索到的条目
    12. driber.find_elemenet("id","1").click()
    13. sleep(3)
    14. #关闭浏览器
    15. driver.quit()
    16. 3.强制等待
    17. 即固定等待
    18. 优势:
    19. 用法简单,一般用于项目调试,或者用于等待元素状态、文本发生改变
    20. 劣势:
    21. 等待时间固定,如果脚本中大量使用会导致脚本运行效率低
    22. import time
    23. time.sleep(2)
    24. 实例:以百度搜索框为例
    25. from selenium import webdriver
    26. from time import sleep
    27. #创建webDriver对象  Chrome()封装了谷歌的一些方法
    28. #如果把驱动放置到了 系统环境变量目录中,可不带参数创建
    29. driver=webdriver.Chrome()
    30. #如果没有放置到系统环境变量目录中,需要通过参数指定
    31. #driver = webdriver.chrome(executable_path="./chromedriver.exe")
    32. url = 'https://www.baidu.com'
    33. #使用浏览器打开指定页面
    34. driver.get(url)
    35. #输入框输入要搜索的内容   博肖
    36. driver.find_element("id","kw").send_kesys("博肖")
    37. #点击 百度一下
    38. driver.find_element("id","su").click()
    39. #强制等待   不是最优解,每个电脑的加载速度不一样
    40. sleep(1)
    41. #点击一个搜索到的条目
    42. driber.find_elemenet("id","1").click()
    43. sleep(3)
    44. #关闭浏览器
    45. driver.quit()

    4)模拟鼠标操作

    selenium可以模拟鼠标的操作

    需导包:

    from selenium.wevdriver.common.action_chains import ActionChians

    使用步骤:

    1. 创建ActionChains对象
    2. 使用ActionChains对象的方法进行操作
      1. context_click()  右击-->模拟说吧右键点击效果
      2. double_click()  双击
      3. drag_and_drop()   拖动-->模拟双标拖动效果
      4. move_to_element()  悬停-->模拟鼠标悬停效果
      5. 其他   可参考ActionChains的源代码
    3. 通过ActionChains"提交"这些操作

    perform()  执行-->此方法用来执行以上所有鼠标方法

    例子:百度搜索eg

    01右击:

     

    1. from selenium import webdriver
    2. from time import sleep
    3. from selenium.wevdriver.common.action_chains import ActionChians
    4. from selenium.webdriver.common.by import By
    5. #创建webDriver对象  Chrome()封装了谷歌的一些方法
    6. #如果把驱动放置到了 系统环境变量目录中,可不带参数创建
    7. driver=webdriver.Chrome()
    8. #如果没有放置到系统环境变量目录中,需要通过参数指定
    9. #driver = webdriver.chrome(executable_path="./chromedriver.exe")
    10. #driver=webdriver.Chrome("chromedriver.exe")与代码同在一文件夹
    11. url = 'https://www.baidu.com'
    12. #使用浏览器打开指定页面
    13. driver.get(url)
    14. #右击
    15. action = ActionChains(driver)
    16. action.context_click(driver.find_element("id","su"))
    17. #实践的操作一定要执行
    18. action.perform()
    19. sleep(3)
    20. #关闭浏览器
    21. driver.quit()

    02悬停:

    悬停摄像头图标

     

    1. #其他代码同上
    2. action.move_to_element(driver.find_element("class name","soutu_btn"))

    eg2:

    百度的:

     

    1. driver.get('https://www.baidu.com')
    2. item = driver.find_element('id', 's-usersetting-top')
    3. ActionChains(driver).move_to_element(item).perform()  # 模拟鼠标的移动操作
    4. driver.find_element('link text', '高级搜索').click()

    隐藏不可操作:

     

    可见可操作:

     

    实操

     

    1. driver.get('https://www.qq.com')
    2. item = driver.find_element('class name', 'more-txt')
    3. ActionChains(driver).move_to_element(item).perform()
    4. driver.find_element('link text', '车型').click()

    03拖拽

     

    1. #拖拽
    2. action.drag_and_drop(driver.find_element("id","div1"),
    3.   driver.find_element("id","div2"))

    5)键盘操作

    1. 方法
    element.send_keys()
    1. 参数
      • 普通字符串
      • ”键盘按键“

    键值

    解释

    send_keys(Keys.BACK_SPACE)

    删除键BackSpace

    send_keys(Keys.SPACE)

    空格键Space

    send_keys(Keys.TAB)

    制表键Tab

    send_keys(Keys.ESPACE)

    回退键Esc

    send_keys(Keys.ENTER)

    回车键Enter

    send_keys(Keys.CONTROL,‘a’)

    全选Ctrl+A

    send_keys(Keys.CONTROL,‘c’)

    复制CTRL+C

    send_keys(Keys.CONTROL,‘x’)

    剪切CTRL+X

    send_keys(Keys.CONTROL,‘v’)

    粘贴Ctrl+V

    send_keys(Keys.F1)

    键盘F1

    send_keys(Keys.F12)

    键盘F12

    1. 例子

     

    实例:

     

    1. from selenium import webdriver
    2. from time import sleep
    3. from selenium.webdriver.common.keys import keys
    4. #创建webDriver对象  Chrome()封装了谷歌的一些方法
    5. #如果把驱动放置到了 系统环境变量目录中,可不带参数创建
    6. driver=webdriver.Chrome()
    7. #如果没有放置到系统环境变量目录中,需要通过参数指定
    8. #driver = webdriver.chrome(executable_path="./chromedriver.exe")
    9. url = 'https://www.baidu.com'
    10. #使用浏览器打开指定页面
    11. driver.get(url)
    12. el = driver.find_element("id","kw")
    13. #输入python
    14. el.send_keys("python")
    15. time.sleep(2)
    16. #全选
    17. el.send_keys(keys.CONTROL,"a")
    18. time.sleep(2)
    19. #回退键  删除
    20. el.send_keys(keys.BACKSPACE)
    21. time.sleep(2)
    22. el.send_keys("博肖")
    23. time.sleep(2)
    24. #全选
    25. el.send_keys(keys.CONTROL,"a")
    26. time.sleep(2)
    27. #复制
    28. el.send_keys(keys.CONTROL,"c")
    29. time.sleep(2)
    30. #粘贴
    31. el.send_keys(keys.CONTROL,"c")
    32. time.sleep(2)
    33. sleep(3)
    34. #关闭浏览器
    35. driver.quit()

    6)下拉框选择

    下拉框是HTML