三、浅谈 Selenium

1.Selenium 简介:

  Selenium 是一款免费的、开源的、基于 Web 页面的 UI 自动化测试工具,可以支持多个浏览器。

 

2.Selenium 框架由多个工具组成:Selenium IDE、Selenium RC、Selenium WebDriver、Selenium Grid

  (2.1)Selenium IDE:通过录制操作完成基本脚本构建的工具;

  (2.2)Selenium RC

  (2.3)Selenium WebDriver:可以直接发命令给浏览器

  (2.4)Selenium Grid:用于运行不同的机器,不用的浏览器进行并行测试,目的就是加快测试用例的运行速度,从而减少测试运行的总时间。

 

3. Selenium 的基本元素定位:

  (1)id定位:id 属性在 HTML 中是唯一的,类似于元素身份证号码,driver.find_element_by_id("id")

  (2)name定位:识别首个 name 属性等于定位值的页面元素,driver.find_element_by_name("name")

  (3)class_name定位:class 属性在页面中不是唯一的,driver.find_element_by_clss_name("class")

  (4)tag_name定位:driver.find_element_by_tag_name("tag_name")

  (5)link_text定位:定位文本链接,driver.find_element_by_link_text("link_text")

  (6)partial_link_text:提取部分文本链接定位,driver.find_element_by_partial_link_text("部分文本")

  (7)xpath 定位:

    两种方式:绝对路径定位、相对路径定位

    相对路径:表示相对当前标签而言的路径结构

    (1)属性定位语法://标签名[@属性名=属性值]

    (2)多属性定位://标签名[@name='username' and @pwd='password']

    (3)函数定位:

        text 函数定位语法://标签名[text()=文本内容]

        contains函数定位语法://标签名[contains(@属性名, 对应属性值)]

  (8)css定位:通过选择器定位

  (9)JS定位:常用的定位方式总结:

    id定位:document.getElementById()

    name定位:document.getElementByName()

    tag定位:document.getElementByTagName()

    class定位:document.getElementByClassName()

    css定位:document.querySelectorAll()

    举例:js = "document.getElementById("id")"

       driver.execute_script(js)

 

4.隐藏元素如何定位?

  首先隐藏元素是可以定位的,只是隐藏元素无法进行操作。

  解决方法:通过 JS 脚本定位到该元素,获取对应的元素对象,然后通过 removeAttribute 和 setAttribute 两个方法完成属性的删除或者重新赋值操作,使当前属性处于显示状态。

 

5.selenium对浏览器操作:

  (1)浏览器前进操作:

    forward():在初始操作时,不存在前进操作,一般与back配合使用;

    back():后退操作

  (2)浏览器的最大化、最小化、全屏

    窗口最大化:driver.maximize_window()

    窗口最小化:driver.minimize_window()

    窗口全屏:driver.fullscreen_window()

  (3)浏览器 close 和 quit 方法的区别:

    driver.close():关闭当前对象所处页面的窗口

    driver.quit():关闭所有的页面窗口并关闭驱动器

  (4)浏览器的相关属性获取

    获取当前对象的 url 地址:driver.current_url

    获取当前对象的句柄:driver.current_window_handle

    获取当前对象的标题:driver.title

    获取当前对象的所有句柄:driver.window_handles

  (5)浏览器操作:driver.switch_to_window(句柄名)

  (6)浏览器中 alert 框处理:

    alert 框是无法直接进行元素定位的,需要使用 driver.switch_to.alert 先切换到 alert 对象中,然后调用对应的方法执行。

    accept():表示确定,dismiss():表示取消

  (7)浏览器的滚动条操作:
    浏览器滚动条无法直接进行定位,所以需要借助 JS 脚本完成操作。

    driver.execute_script("window.scrollTo(0, 100)"):x 表示横向滚动,y表示纵向滚动

  (8)driver.get_attribute(name):获取属性值

 

6.下拉列表框的定位方式:

  WebDriver 内置了一个 Select 模块,用于实现下拉列表框的处理操作。

  from selenium.webdriver.support.select import Select

  定位方法:

  (1)select_by_index():通过索引定位(从 0 开始)

  (2)select_by_value():通过 value 值定位

  (3)select_by_visible_text():通过选项的文本值定位

 

7. 三种元素等待方式:

  (1)强制等待:time.sleep(x),表示等待 x 秒后,进行下一步操作。强制等待又称为强制休眠,该方式只能够作用于当前行的脚本。

    缺点:影响代码的执行速度,不能精确设定代码的休眠时间,时间过长则一定要等待设定的时间之后才能继续执行代码。

    优点:使用简单,可以在调试时使用

  (2)隐式等待:driver.implicitly_wait(x):在 x 时间内页面加载完成,进行下一步操作。隐式等待又称为智能等待,也称为全局等待。表示整个页面中的所有元素加载完才会执行,会根据其内部所设定到的频率不断地刷新页面继续记载,并检测当前所执行的元素是否加载完毕。

    缺点:使用隐式等待,程序会一直等待整个页面加载完成,才会执行下一步操作。但有时页面想要的元素已经加载完成了,但网页上个别元素没有加载完成,仍要等到页面全部加载才能执行下一步,使用也不是很灵活。

    优点:隐式等待对整个脚本的生命周期都起作用,所以只要设置一次即可。

  (3)显式等待:WebDriverWait,对单个元素设定一定的频率,使其按频率刷新当前页面并检测是否存在该元素。

    from selenium.webdriver.support.wait import WebDriverWait

    WebDriverWait(driver, 5).until(lambda dir: dir.find_element_by_id("value"))

 

8.验证码的处理方式:

  (1)去掉验证码:将验证码相关代码注释掉

  (2)设置万能验证码:让开发人眼在程序中声明一个万能验证码

  (3)只保留一个资源:如果是图片资源,实际就是在指定的文件夹资源库中随机抽取一张,将服务器上的所有图片全部删除只留一张,相当于固定验证码

  (4)光学字符识别:使用 python-tesseract 模块来识别图片中的验证码

  (5)打码平台识别:如斐斐、图鉴等,调用第三方接口识别

 

posted @ 2024-06-20 17:45  努力的小测试  阅读(1)  评论(0编辑  收藏  举报