Python UI自动化基础(一)

第一章、基础概念

一、打开浏览器开发者工具

  • 台式电脑:F12
  • 笔记本:FN+F12

1、开发者工具显示设置

二、dos系统

        DOS(Disk Operating System)是早期个人计算机中广泛使用的操作系统。它最初由微软(Microsoft)在1981年推出,主要用于IBM PC及其兼容机上。DOS是基于命令行界面的操作系统,用户需要通过键入命令来执行各种任务,而不像现代图形化操作系统那样使用鼠标和图形界面。

        最著名的DOS版本是MS-DOS(Microsoft Disk Operating System),它由微软与IBM合作开发,用于IBM PC。随着IBM PC的普及,MS-DOS成为当时主流个人计算机的操作系统。

        DOS是一个单用户、单任务的操作系统,意味着在同一时间内只能运行一个程序。它没有内存保护机制,导致程序之间的错误可能相互影响,容易出现崩溃。

        DOS的命令行界面使用简单的文本命令,用户可以通过输入命令来执行文件管理、目录操作、文件复制、批处理脚本等任务。它也支持批处理脚本,允许用户将一系列命令保存到脚本文件中并批量执行。

        虽然DOS在90年代被逐渐取代,但在早期个人计算机的历史中扮演了重要的角色。后来,图形化操作系统(如Windows、macOS和Linux)逐渐取代了DOS,提供更直观和易用的界面,同时支持多任务和多用户环境,使计算机操作更加便捷和功能强大。

三、测试脚本

        测试脚本(Testing script),一般指的是一个特定测试的一系列指令,这些指令可以被自动化测试工具执行。 为了提高测试脚本的可维护性和可复用性,必须在执行测试脚本之前对它们进行构建。或许会发现这样的情况,即有的操作将出现在几个测试过程中。因此,应有目的地确定这些操作的目标,这样就可以复用它们的实施。 测试脚本是自动执行测试过程(或部分测试过程)的计算机可读指令。测试脚本可以被创建(记录)或使用测试自动化工具自动生成,或用编程语言编程来完成,也可综合前三种方法来完成。

四、API

API,全称Application Programming Interface,即应用程序编程接口。

API是一些预先定义函数,目的是用来提供应用程序与开发人员基于某软件或者某硬件得以访问一组例程的能力,并且无需访问源码或无需理解内部工作机制细节。

API就是操作系统给应用程序的调用接口,应用程序通过调用操作系统的 API而使操作系统去执行应用程序的命令(动作)。在 Windows 中,系统API是以函数调用的方式提供的

五、UI自动化测试

        自动化测试它是在回归测试阶段进行的测试过程,目的为了当前版本提交模块在新回归过程中是否都是完整和正确的;可以提高测试效率

1、定义

一般定义:在测试过程中,凡是需要借助测试工具进行测试工作都可以称为自动化测试。
通俗定义:编程测试,就是编写一个程序来测试另外一个程序正确性。

  • 开发人员编程:软件从无到有过程。将需求文档中客户功能点通过开发语言方式来实                    现。
  • 测试人员编程:编写一段程序代码来验证开发提要代码的正确或稳定性

2、自动化测试是人为驱动测试 转换机器自动执行的过程

        自动化测试是指使用脚本、工具或软件来代替手动测试过程,实现测试用例的自动执行和结果的自动验证。它将人为驱动的测试转换为机器自动执行的过程,从而提高测试效率、减少测试成本,并增加测试的可重复性和一致性。

  • WebUI自动化 测试 工具  Selenium
  • 手机UI自动化 测试工具 appium

3、自动化测试分类(根据自动化测试工具具有作用进行分类)

  • 手工测试性能测试工具:Load Runner,Jmeter
  • 接口测试工具:postman,Jmeter
  • 功能测试、回归测试工具:qtp(UFT),selenium,appnium

4、bug追踪系统及配置管理工具

Bug跟踪系统(bug管理工具):禅道,bugfree,mantis,bugzilla,JIRA等等
配置管理工具:SVN,GIT

六、学习UI自动化测的目的

1、需求

需求: 测试被测网站  打开关闭100次+登录多用例  手工测试怀疑人生
解决: 写一个python脚本,控制工具  网站自动执行(自动打开  自动完成业务流程)===》UI自动化(python---》selenium--》浏览器---》网站自动执行)

2、引入UI自动化先决条件

自动化不是万能的(比如安全控件(验证码,在测试环境让开发万用码+Cookie值(保留登录成功状态)))

  • 1遇到大量重复工作量
  • 2需求不变更(稳定)
  • 3项目周期足够长(编写脚本花费时间)

3、自动化优点

  • 减少重复工作量+提高测试效率+速度快
  • 节省人力成本+代码重复使用+回归测试,提高回归测试效率,非常适合敏捷开发过程
  • 针对网站监控
  • 测试数据模拟
  • 自动化测试可以实现无人值守的测试
    • 压力测试:测试软件在极限值测试过程,需要模拟出批量用户
    • 并发测试:测试大批量用户同一时刻向服务器发送请求过程
    • 稳定性测试:软件在一定压力情况,执行长时间后服务器各种性能指标反应

4、自动化缺点

  • 学习成本大(python unittest  selenium 维护成本 )自动化测试对测试人员要求会比手工测试要求要高:至少掌握一门开发语言
  • 项目需求不断变更 不适合自动化
  • 实际工作中  selenium不可定位元素(验证码 安全控件  非标准html元素)
  • 自动化测试比手工测试更加脆弱,无法应用系统变化
  • 自动化测试过程使用自动化测试工具,本身也是软件,或多或少存在bug,不能完全依赖自动化测试工具
    • 自动化测试用例工作量远远大于手工测试用例设计工作量        

七、如何掌握webUI自动化测试

  • Web自动化工具  selenium   其它(QTP UFT贵)目标  用selenium 让web网站自动运行  即可
  • 经典UI自动化搭配
    • 测试脚本 Python+pycharm+selenium+Unittest(python自带测试框架)+驱动(帮助selenium识别浏览器)+浏览器(chrome)+被测的网站
    • 不关心被测试网站(java  python php 测试对象对我们都是一样的)
  • Webui自动化测试内容
    • 1)web界面文本内容正确性和图片内容正确性-----建议将图片内容正确性交给接口测试
    • 2)Web界面功能之间交互逻辑

八、自动化测试流程

自动化测试主要用于回归测试中,一般很少发现bug

  • 1)制定测试计划:测试范围、测试进度、测试环境(自动化测试工具运行环境)、测试人员、测试风险等等
  • 2)测试用例设计
  • 3)搭建测试环境
  • 4)编写测试脚本:编写脚本独立运行至少2次没有任何错误时,才会将测试脚本上传到配置管理库中(SVN)
  • 5)执行测试脚本(分析结果,记录自动化测试过程中发现bug)
  • 6)脚本维护,编写测试总结报告

第二章、WebUI自动化测试工具:selenium

一、概述

        Selenium是一种流行的自动化测试工具,专门用于模拟浏览器行为和交互,以进行Web应用程序的自动化测试。它支持多种编程语言,包括Python,可以用于自动化执行各种浏览器操作,如点击按钮、填写表单、导航到页面等。Selenium可以用于功能测试、回归测试和验收测试,帮助开发团队验证应用程序在不同浏览器和环境中的行为。

以下是关于Selenium的一些主要特点和用途:

1、特点

  1. 跨浏览器测试: Selenium支持多种主流浏览器,包括Chrome、Firefox、Edge、Safari等,使您能够在不同浏览器上进行一致性测试。

  2. 模拟用户行为: Selenium允许您以编程方式模拟用户与Web应用程序的交互,如点击、输入、提交表单等。

  3. 多语言支持: Selenium支持多种编程语言,如Python、Java、C#、Ruby等,使您可以在熟悉的语言中编写测试脚本。

  4. 可扩展性: Selenium可以与其他测试框架和工具集成,如TestNG、JUnit、Cucumber等,以支持更高级的测试和报告。

  5. 分布式测试: Selenium Grid允许您在多台机器上并行执行测试,以加快测试速度。

2、用途

  1. 功能测试: 可以通过编写Selenium脚本模拟用户的功能操作,确保应用程序的各项功能正常运行。

  2. 回归测试: 在应用程序发生变化时,可以使用Selenium自动执行回归测试,确保新功能或修改不会破坏原有功能。

  3. 验收测试: 使用Selenium来验证应用程序是否满足客户的需求和规范,确保交付的产品质量。

  4. 性能测试: 结合其他工具,可以使用Selenium进行性能测试,模拟多个用户同时访问应用程序,评估系统的性能和稳定性。

3、selenium是C/S架构软件

Selenium的C/S架构允许测试脚本在客户端编写,然后通过服务器将操作传递给浏览器驱动程序执行,以实现Web应用程序的自动化测试。

        Selenium是一种客户端-服务器(Client-Server,C/S)架构的软件。在Selenium中,这种架构主要体现在使用Selenium WebDriver和Selenium Standalone Server这两个主要组件上。

        总之,Selenium是一个强大的自动化测试工具,特别适用于Web应用程序的自动化测试。它提供了丰富的功能和灵活性,可以帮助开发团队提高测试效率、减少人工测试工作,并确保应用程序在不同浏览器和环境下的一致性。

二、selenium的组成

需要注意的是,尽管Selenium WebDriver和Selenium IDE可以被视为客户端组件,它们实际上并不直接与应用程序进行交互。它们生成的测试脚本被发送到Selenium Standalone Server,然后由服务器与浏览器驱动程序进行通信并执行操作。

Selenium是一个综合性的自动化测试框架,它由多个组件组成,用于模拟浏览器行为和执行自动化测试。以下是Selenium的主要组件:

1、Selenium WebDriver(客户端)

        WebDriver是Selenium的核心组件,用于模拟用户在浏览器中的操作,如点击、输入、导航等。它支持多种浏览器,允许您编写测试脚本来自动化执行这些操作。WebDriver提供了不同编程语言的客户端库,如Python、Java、C#等,使您能够在您熟悉的语言中编写测试脚本。

        Selenium WebDriver是Selenium的客户端组件,它是用于编写自动化测试脚本的一组API。通过使用不同编程语言的客户端库(如Python、Java、C#等),您可以在测试脚本中编写模拟浏览器行为的操作。WebDriver负责将您的操作转换为浏览器可以理解的指令,然后将这些指令发送给Selenium服务器。

2、Selenium IDE(Integrated Development Environment)(部分客户端)

        Selenium IDE是一个浏览器插件,用于录制和回放用户与Web应用程序的交互。尽管它有图形界面,但它也可以被视为一种客户端,因为它允许用户在浏览器中进行操作并生成测试脚本。

3、Selenium Grid(服务器)

        Selenium Grid允许您在多个机器上并行执行测试,以加快测试速度。它允许您将测试脚本分发到不同的浏览器和操作系统组合中,以进行大规模的自动化测试。

        Selenium Grid是Selenium的服务器组件,它允许在多个机器上并行执行测试。Grid服务器充当中央控制器,协调不同的客户端请求,将测试分发到不同的浏览器和环境中执行。

4、Selenium Standalone Server(服务器)

        Selenium Standalone Server是一个中心化的服务器,用于管理不同浏览器驱动程序和Selenium Grid。它允许您在不同的环境中运行自动化测试,并处理多个浏览器的并发执行。

        Selenium Standalone Server是Selenium的服务器组件,充当中介,接收来自WebDriver或其他客户端的指令并将其翻译成浏览器特定的操作。服务器负责与浏览器驱动程序进行通信,以执行测试脚本中的操作。

5、浏览器驱动程序

        每种浏览器都需要相应的驱动程序来与Selenium WebDriver进行交互。这些驱动程序充当中介,将WebDriver的命令翻译成浏览器特定的操作。例如,Chrome需要ChromeDriver,Firefox需要GeckoDriver等。

        总之,Selenium的主要组件包括WebDriver、Selenium IDE、Selenium Grid、Selenium Standalone Server以及浏览器驱动程序。通过这些组件,Selenium提供了丰富的功能,使您能够自动化执行各种浏览器操作,以进行Web应用程序的自动化测试。

三、Selenium架构

它基于Client/Server架构设计,其架构图如下所示

  • Language Bindings/Client
    • 也叫做ClientLibrary,它是Selenium框架的一系列jar文件,可以使用不同的编程语言编写,也正因为它的存在,才使得各个语言编写的测试代码能够被正确解析
  • 浏览器驱动WebDriver
    • WebDriver用于管理和完全控制浏览器,根据不同的浏览器区分不同的Driver
  • HTTP传输的JSON Wire协议
    • JSON(JavaScript Object Notation)是一种在Web上的服务器端和客户端之间传输数据的开放标准
    • JSON Wire协议是一个抽象规范,定义了用户在自动化脚本里操作该如何映射到Selenium或HTTP请求和响应中,通过JSON Wire协议可以在HTTP服务器之间传输信息,Language Bindings和WebDriver就是通过HTTP协议传输JSON数据的
  • 多浏览器
    • Selenium/WebDriver几乎支持所有主流浏览器,通过浏览器驱动实现对浏览器的控制

四、Selenium WebDriver工作原理

        根据selenium的客户端selenium WebDriver 提供的API写好测试脚本,运行脚本时,创建selenium WebDriver实例,selenium WebDriver实例通过JSON Wire协议将脚本指令发送到selenium Standalone Server服务器,selenium Standalone Server服务器通过http协议与浏览器驱动程序进行通讯,浏览器驱动程序驱动浏览器进行测试脚本中的操作,浏览器驱动程序将操作的结果(例如元素状态、页面截图等)转发回 Selenium Standalone Server,然后再传递给测试脚本。

Selenium WebDriver实例:本地运行

        WebDriver 实例是 WebDriver 客户端库通过连接到 WebDriver 服务器创建的一个对象,用于控制特定浏览器的自动化测试任务。通过调用客户端库提供的方法,您可以使用 WebDriver 实例来模拟用户在浏览器中的操作,如打开网页、点击元素、输入文本、提交表单等。WebDriver 实例负责将您的测试脚本翻译为浏览器可以执行的命令,并将执行结果返回给客户端库,以便您进行进一步的操作或断言。通常情况下,您可以使用单个 WebDriver 实例执行一个或多个测试用例。当您完成测试任务后,可以调用客户端库提供的方法来关闭浏览器并断开与 WebDriver 服务器的连接。

Selenium Remote WebDriver实例:远程运行

        在Selenium中,Remote WebDriver是一种特殊类型的WebDriver,用于在不同计算机或设备之间执行自动化测试。它允许您通过网络连接到远程计算机上的浏览器驱动程序,从而在远程环境中执行测试,而不是在本地计算机上执行。

        使用Remote WebDriver,您可以将测试脚本发送到远程服务器,让服务器上的浏览器执行操作,然后将执行的结果返回给您的测试脚本。这对于在分布式环境中执行大规模的自动化测试非常有用,或者当您需要在不同操作系统、浏览器或设备上测试时,可以轻松地在多个环境中运行测试。

Remote WebDriver的工作原理如下:

  1. 配置远程服务器: 首先,您需要在远程服务器上配置所需的浏览器驱动程序和Selenium Standalone Server。

  2. 创建Remote WebDriver对象: 在本地测试脚本中,您需要创建一个Remote WebDriver对象,指定要连接的远程服务器的地址和端口。

  3. 发送操作指令: 您可以使用Remote WebDriver对象发送操作指令,就像在本地使用普通WebDriver一样。指令将通过网络传递到远程服务器。

  4. 远程服务器执行操作: 远程服务器接收到操作指令后,会将这些指令传递给浏览器驱动程序,并在远程环境中执行操作。

  5. 获取和验证结果: 执行完成后,远程服务器将结果返回给您的测试脚本,您可以获取和验证执行的结果。

        使用Remote WebDriver时,您可以将测试分发到多个远程计算机上,实现并行执行测试,提高测试效率。这在大规模测试和跨多个环境进行测试时尤其有用。

        总之,Remote WebDriver是Selenium中的一个重要功能,允许您在远程环境中执行自动化测试,从而实现更灵活和高效的测试方案。

        Remote WebDriver 可以被认为是 Selenium 的客户端组件之一。虽然 Remote WebDriver 本身不直接与浏览器交互,但它是测试脚本与远程服务器之间通信的客户端工具。

Remote WebDriver 的工作方式如下:

  1. 客户端代码(测试脚本): 在本地计算机上,您编写测试脚本,创建 Remote WebDriver 对象并发送操作指令。这部分代码被视为客户端代码,负责发起测试请求。

  2. 远程服务器: 在远程服务器上,配置了相应的浏览器驱动程序和 Selenium Standalone Server。远程服务器充当服务器端,接收来自客户端代码的操作指令。

  3. 浏览器驱动程序: 在远程服务器上,浏览器驱动程序负责将客户端代码发送的操作指令转化为浏览器特定的操作。

  4. 浏览器: 在远程服务器上的浏览器执行操作,将执行结果返回给远程服务器。

        通过这种方式,Remote WebDriver 充当客户端,通过网络连接与远程服务器进行通信,并将操作指令传递到远程环境执行。尽管 Remote WebDriver 本身不直接与浏览器交互,但它在整个远程测试过程中扮演了重要的角色。

        总之,Remote WebDriver 可以被认为是 Selenium 的客户端组件,用于在本地计算机上编写测试脚本,然后将操作指令发送到远程服务器以执行自动化测试。

1、测试脚本编写

        开发者使用Selenium客户端提供的API编写测试脚本,这些API允许您模拟用户与Web应用程序进行交互,例如点击按钮、填写表单等。

2、创建WebDriver实例:

        在测试脚本中,您将创建一个WebDriver实例,这是与浏览器交互的主要接口。WebDriver是一个接口,不同的浏览器(例如Chrome、Firefox等)都有相应的实现,您可以选择适合您需求的浏览器。

3、JSON Wire Protocol:

又称WebDriver 协议

        一旦创建了WebDriver实例,测试脚本会使用WebDriver提供的方法,将指令和参数转换成符合JSON Wire Protocol标准的请求。JSON Wire Protocol是一种用于浏览器自动化的协议,它定义了如何在客户端(测试脚本)和服务器(Selenium Standalone Server)之间进行通信。

4、Selenium Standalone Server

        Selenium Standalone Server是一个中间服务器,它接收来自测试脚本的请求,然后将这些请求转发给特定的浏览器驱动程序。这个服务器可以帮助您在不同的浏览器之间切换,而无需更改您的测试脚本。

5、HTTP协议

在Selenium WebDriver的实现中,HTTP协议在两个主要方面发挥作用:

  1. 与Selenium Standalone Server通信: 测试脚本通过WebDriver API生成的请求被编码为符合JSON Wire Protocol标准的HTTP请求,并发送到Selenium Standalone Server。Selenium Standalone Server解析这些HTTP请求,并将它们转发给适当的浏览器驱动程序,以便在浏览器中执行相应的操作。

  2. Selenium Standalone Server与浏览器驱动程序通信: Selenium Standalone Server通过HTTP协议与浏览器驱动程序进行通信。它将来自测试脚本的请求转发给浏览器驱动程序,浏览器驱动程序然后将这些请求翻译成浏览器能够理解的原生命令,并将其通过HTTP请求发送到正在控制的浏览器实例。

        所以,HTTP协议在Selenium WebDriver的实现中起到了关键的作用,它用于在测试脚本、Selenium Standalone Server和浏览器驱动程序之间进行通信,以便实现自动化的浏览器操作。

6、浏览器驱动程序

        对于每种浏览器,都有相应的浏览器驱动程序(例如ChromeDriver、GeckoDriver等)。这些驱动程序负责将来自Selenium Standalone Server的请求转化为浏览器能够理解的原生命令,然后将这些命令发送给浏览器。

7、与浏览器通信

        浏览器驱动程序通过与浏览器进行通信,执行测试脚本中的操作,例如打开URL、点击元素等。浏览器执行这些操作并返回结果。

8、结果传递

        浏览器驱动程序将操作的结果(例如元素状态、页面截图等)转发回Selenium Standalone Server,然后Selenium Standalone Server再将结果传递给测试脚本。

9、测试脚本执行下一步动作

测试脚本可以根据返回的结果继续执行下一步操作,或者进行断言和验证。

第三章、测试环境搭建

一、版本兼容

1、python解释器版本:3.6.7

2、selenium版本:3.141.0

3、chrome浏览器版本:80

4、chrome浏览器驱动版本:80

二、python环境搭建

详见  Python语法相关知识汇总(一)

由于选择了脚本开发语言是python,所以需要搭建python开发环境。
如果选择了脚本开发语言是java,需要搭建的java环境

三、Selenium工具环境搭建

1、在线安装

在线安装(需要电脑连接互联网),使用指令(并指定了selenium需要的版本)

在dos下输入以下指令:完成安装

pip install selenium==3.141.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

2、离线安装

注意包与包之间的依赖,安装顺序

由于selenium安装需要依赖urllib3,所以需要先安装urllib3,然后再来安装selenium

离线安装(电脑没有连接互联网),需要准备好安装的文件,文件后缀:whl

1)从whl文件所在目录进入dos

2)pip  install   *.whl 回车即可

3)安装完成后需要测试selenium:进入dos输入如下指令 

        后续安装几乎所有第三方库都会存放到上图白色区域所指定目录下,通过这个目录,当前python解释器路径:d:\python37目录下 

四、浏览器驱动程序环境搭建

Selenium需要安装对应的浏览器驱动,才能驱动浏览器自动测试,由于编写脚本通过浏览器驱动程序启动对应浏览器,打开对应被测试应用程序。所以需要配置浏览器驱动程序。
特点:不同浏览器拥有自己的驱动程序;
      浏览器版本不同,需要驱动程序版本也不同

1、检查当前浏览器版本

2、下载对应版本的浏览器驱动程序

谷歌浏览器

谷歌浏览器下载历史版本

禁用谷歌浏览器更新

禁用谷歌浏览器更新设置2

chorme浏览器驱动程序下载地址:

http://chromedriver.storage.googleapis.com/index.html 

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

版本对照表:

ChromeDriver与Chrome版本对应参照表及ChromeDriver下载链接_114.0.5735.134 driver_Peter.Pan的博客-CSDN博客

火狐浏览器

firefox浏览器驱动程序下载地址:

https://github.com/mozilla/geckodriver/releases

版本对照表:

Supported platforms — Firefox Source Docs documentation

下载火狐80版本,32位地址:

http://download.firefox.com.cn/releases-sha2/full/80.0/zh-CN/Firefox-full-latest.exe

firefox历史版本​​​​​​​ 

Edge浏览器

Edge浏览器驱动程序下载地址:
https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

3、设置驱动环境变量(系统和用户都要配置)

第一种做法:

可以直接将浏览器驱动程序对应的exe文件复制粘贴到python解释器路径下,由于这个解释器路径在安装配置python环境时,已经配置到了系统环境变量python下

 第二种做法:

直接将浏览器驱动程序exe文件所在目录配置到系统环境变量path下

4、测试驱动

命令行中输入驱动名

第四章、selenium的包和模块

一、selenium的组成包

        在 Selenium 3.141.0 版本中,selenium.common 包和 selenium.webdriver 包都是 Selenium Python 客户端库的一部分,用于支持不同的功能和操作。让我为您详细解释一下这两个包的内容和作用:

1、selenium.common 包

         selenium.common 包包含了一些在 Selenium 客户端库中常用的模块、异常和工具,这些模块和工具在各个部分的代码中都可能会被使用到。这个包并不是直接用于执行测试,而是为其他模块提供了共享的功能和异常处理。

一些在 selenium.common 包中的重要模块和异常包括:

  • exceptions: 这个子包包含了 Selenium 执行过程中可能会抛出的异常,如 NoSuchElementExceptionTimeoutExceptionWebDriverException 等。您可以使用这些异常来捕获并处理在测试过程中可能发生的问题

2、selenium.webdriver 包

         selenium.webdriver 包是 Selenium Python 客户端库中用于实现 Web 驱动操作的核心部分。它提供了各种不同的 WebDriver 子类,每个子类用于支持不同的浏览器。通过这些子类,您可以创建浏览器对象并执行各种与浏览器交互的操作。

一些在 selenium.webdriver 包中的重要子模块和类包括:

  • chrome: 这个子模块包含了与 Chrome 浏览器交互的类和方法。您可以使用 webdriver.Chrome 类来实例化一个 Chrome 浏览器对象,然后执行各种操作。
  • firefox: 这个子模块包含了与 Firefox 浏览器交互的类和方法。您可以使用 webdriver.Firefox 类来实例化一个 Firefox 浏览器对象。
  • edge: 这个子模块包含了与 Microsoft Edge 浏览器交互的类和方法。
  • ie: 这个子模块包含了与 Internet Explorer 浏览器交互的类和方法。
  • 其他子模块:还有其他一些子模块,用于支持不同类型的浏览器和驱动。每个子模块都包含了用于与特定浏览器交互的类和方法。

        通过这两个包,您可以使用 Selenium 客户端库来自动化测试,模拟用户与网页的交互,进行页面导航、元素定位、表单操作等等。您可以根据需要选择适合您测试目标的 WebDriver 子类,然后使用这些类中的方法来执行相应的操作。

二、selenium.webdriver 包的组成包

        在 selenium.webdriver 包中,不同的子包代表了不同的浏览器和驱动类型,用于支持与各种浏览器进行交互的功能。每个子包中都包含了特定浏览器的驱动实现和相关的类、方法。以下是 selenium.webdriver 包中一些常见的子包及其内容的详细解释:

1、selenium.webdriver.chrome

        这个子包提供了与 Google Chrome 浏览器进行交互的功能。您可以使用 webdriver.Chrome 类来实例化一个 Chrome 浏览器对象,然后通过该对象执行各种操作,如页面导航、元素定位、表单操作等。

2、selenium.webdriver.firefox

        这个子包提供了与 Mozilla Firefox 浏览器进行交互的功能。您可以使用 webdriver.Firefox 类来实例化一个 Firefox 浏览器对象,然后通过该对象执行各种操作。

3、selenium.webdriver.edge

        这个子包提供了与 Microsoft Edge 浏览器进行交互的功能。您可以使用 webdriver.Edge 类来实例化一个 Edge 浏览器对象,然后通过该对象执行各种操作。

4、selenium.webdriver.ie

这个子包提供了与 Internet Explorer 浏览器进行交互的功能。您可以使用 webdriver.Ie 类来实例化一个 Internet Explorer 浏览器对象,然后通过该对象执行各种操作。

5、selenium.webdriver.remote

        是 Selenium Python 客户端库中的一个关键子包,用于支持远程浏览器的驱动和交互。远程 WebDriver 允许您在不同的机器上执行测试,通过远程服务器控制浏览器实例。

6、其他浏览器子包

         在某些情况下,还可能会有其他浏览器的子包,用于支持不同类型的浏览器,如 Safari 等。这些子包与上述类似,都包含了与相应浏览器交互的类和方法。

        这些子包中包含了各种不同的类和方法,用于实现与特定浏览器的交互和操作。您可以使用这些类来创建浏览器对象,然后模拟用户与网页的交互。例如,您可以使用 webdriver.Chrome 类来创建一个 Chrome 浏览器对象,然后使用该对象的方法来执行诸如打开网页、查找元素、点击按钮等操作。

        每个子包的内容和功能都在其相应的模块中定义,您可以通过查看模块的文档或源代码来了解每个子包中的具体类和方法。通过选择适当的浏览器子包,您可以根据需要实现对不同浏览器的自动化测试和交互。

三、selenium.webdriver.remote包中的子模块

1、webdriver 模块

        这个模块提供了与远程 WebDriver 服务器进行交互的类和方法。它允许您通过发送请求和接收响应来控制远程浏览器实例,从而执行各种浏览器操作。您可以使用 webdriver.Remote 类来连接到远程服务器,并使用其方法来执行测试。

示例

from selenium import webdriver

remote_driver = webdriver.Remote(command_executor='http://remote-server:port/wd/hub', desired_capabilities={'browserName': 'chrome'})
remote_driver.get("https://www.example.com")

2、webelement 模块

        这个模块提供了与 WebElement 对象(即网页中的单个元素)交互的类和方法。WebElement 类表示一个具体的 HTML 元素,您可以使用它来执行与该元素相关的操作,如点击、输入、获取属性等。

示例:

from selenium import webdriver

driver = webdriver.Chrome(executable_path='path/to/chromedriver.exe')
driver.get("https://www.example.com")
element = driver.find_element("id", "my_element_id")
element.click()

四、selenium.webdriver.chrome包中的子模块

1、webdriver 模块

        这个模块提供了与 Chrome 浏览器交互的类和方法。webdriver.Chrome 类是 WebDriver 的一个子类,专门用于与 Chrome 浏览器进行交互。您可以使用该类来创建 Chrome 浏览器对象,然后执行各种与浏览器相关的操作。

示例:

from selenium import webdriver

chrome_driver = webdriver.Chrome(executable_path='path/to/chromedriver.exe')
chrome_driver.get("https://www.example.com")

五、Chrome类,WebDriver类,WebElement类之间的关系

1、继承结构图示

WebDriver 类是 Selenium 的核心类,用于控制浏览器并执行各种操作WebElement 类表示页面中的单个元素,用于执行元素级别的操作webdriver.Chrome 类是 WebDriver 类的一个子类,专门用于与 Chrome 浏览器进行交互。您可以使用这些类的方法来定位、操作和管理网页中的元素和浏览器行为。

2、 Chrome类:selenium.webdriver.chrome.webdriver 模块中的WebDriver类

         在 Chrome 子包中,webdriver.Chrome 类是 selenium.webdriver 包中的 WebDriver 类的一个子类,用于与 Chrome 浏览器进行交互。它继承了父类 WebDriver 的方法,并且还包括一些特定于 Chrome 浏览器的功能。

示例:

from selenium import webdriver

driver = webdriver.Chrome(executable_path='path/to/chromedriver.exe')
driver.get("https://www.example.com")
element = driver.find_element("id", "my_element_id")

为什么叫做Chrome类,这还要从selenium.webdriver包的__init__.py文件中的导包开始

from .chrome.webdriver import WebDriver as Chrome # noqa

这条Python导入语句涉及到模块导入和在导入过程中使用"noqa"标志。让我逐步解释它的含义:

  1. from .chrome.webdriver: 这是一个相对导入的语法。在Python模块中,使用点.来表示相对于当前模块的位置。这个部分表明从当前模块所在的包(或目录)中导入名为webdriver的模块。

  2. import WebDriver as Chrome: 这部分语句导入了名为WebDriver的类,并将其命名为Chrome。这意味着可以使用Chrome来引用WebDriver类,以便在代码中更加简洁地使用它。

  3. # noqa: 这是一个特殊的注释,用于告诉代码检查工具(如linters)在检查代码时忽略特定的问题。在这里,noqa的目的是告诉代码检查工具忽略与此导入语句相关的任何警告或错误。

        综合起来,这条导入语句的作用是从当前模块所在的包中导入名为webdriver的模块,并将其中的WebDriver类命名为Chrome。同时,通过使用# noqa注释,告诉代码检查工具不要对这个导入语句产生警告或错误。这可能是因为在某些情况下,导入的方式可能与一些代码规范或检查工具的规则不兼容,但在这里开发者认为可以忽略这些规则。

3、WebDriver:selenium.webdriver.remote.webdriver 模块中的WebDriver类

         WebDriver 类是 Selenium 的核心类之一,用于与浏览器进行交互,控制浏览器行为,并执行各种操作。它提供了打开浏览器、导航、元素定位、执行 JavaScript、窗口管理等功能。您可以使用 webdriver.Remote 类(或其他浏览器子类,如 webdriver.Chrome)来实例化一个 WebDriver 对象,然后使用该对象执行各种操作。

示例:

from selenium import webdriver

driver = webdriver.Chrome(executable_path='path/to/chromedriver.exe')
driver.get("https://www.example.com")
element = driver.find_element("id", "my_element_id")

4、WebElement:selenium.webdriver.remote.webelement 模块中的WebElement类

         WebElement 类表示网页中的一个元素,您可以使用 WebDriver 的方法来定位和获取这些元素。每个 WebElement 对象代表一个特定的 HTML 元素,您可以对其进行点击、输入、获取属性等操作。WebElement 对象可以通过 WebDriver 对象的 find_element() 方法或其他方法来获取。

示例:

from selenium import webdriver

driver = webdriver.Chrome(executable_path='path/to/chromedriver.exe')
driver.get("https://www.example.com")
element = driver.find_element("id", "my_element_id")
element.click()

5、解释:WebDriver类和WebElement类都有查找元素的方法

webdriver 模块中的 WebDriver 类和 webelement 模块中的 WebElement 类都有 find_element() 方法,但它们的作用和用法是不同的,不是重复,而是为了在测试过程中提供更灵活的定位元素的方式。

WebDriver 中的 find_element() 方法WebDriver 类中的 find_element() 方法用于在整个页面中查找符合指定定位方式和值的单个元素。它是用于顶层文档的定位,适用于页面中的任意元素,不限于某个特定的 WebElement 对象。这个方法通常用于执行整个页面的元素定位操作。

示例:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.example.com")

element = driver.find_element("id", "my_element_id")

WebElement 中的 find_element() 方法WebElement 类中的 find_element() 方法用于在当前 WebElement 对象的子元素中查找符合指定定位方式和值的单个元素。这个方法通常用于在特定元素内部进行元素定位,限制在当前元素的范围内进行查找。

示例:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.example.com")

parent_element = driver.find_element("id", "parent_element_id")
child_element = parent_element.find_element("class_name", "child_element_class")

        总结起来,两者的 find_element() 方法提供了不同层次的元素定位功能。WebDriverfind_element() 方法在整个页面范围内查找元素,而 WebElementfind_element() 方法在当前元素的子元素中查找元素。这使得在测试中能够更灵活地定位和操作页面上的元素。

第五章、selenium入门

通俗理解为:从类中实例化一个对象,用对象调用类中的方法,但是由于类所在的模块中又调用了许多其他的类,通过复杂的方式,可以实现连续嵌套方法

一、典型案例

from selenium import webdriver
from time import sleep

driver=webdriver.Chrome() #从Chrome()类中实例化一个对象driver
driver.get('http://www.baidu.com')
driver.maximize_window()
sleep(1)
driver.find_element_by_id('kw').send_keys('selenium')
sleep(1)
driver.find_element_by_id('su').click()
sleep(3)

driver.quit()

#(<class 'selenium.webdriver.chrome.webdriver.WebDriver'>, <class 'selenium.webdriver.remote.webdriver.WebDriver'>, <class 'object'>)
print(webdriver.Chrome.__mro__)

二、代码分析

1、from selenium import webdriver 分析

2、driver=webdriver.Chrome()分析

实例化Chrome类并返回示例对象的引用赋值给变量driver

执行路径参数:

不配置系统环境变量单独写执行路径

选择绝对路径,后面在加上驱动名.exe 

缺点:每次执行都要手工配置路径

 初始化过程:通过子进程方式演示调用过程

三、使用开发者工具查找元素定义表达式

四、面向对象编程

from selenium import webdriver
from time import sleep

class TestCase(object):
    def __init__(self):
        self.driver = webdriver.Chrome()

    def perform(self):
        self.driver.get("http://www.baidu.com")
        self.driver.maximize_window()
        sleep(1)
        self.driver.find_element_by_id("kw").send_keys("selenium")
        sleep(1)
        self.driver.find_element_by_id("su").click()
        sleep(3)
        self.driver.quit()

if __name__ == '__main__':
    case = TestCase()
    case.perform()

第六章、WebDriver类的常用属性和方法

一、概述

        在 Selenium 的 Python 客户端库中,webdriver 模块包含了 WebDriver 类,它是操作浏览器的核心类。WebDriver 类提供了一系列方法和属性,用于控制浏览器、导航网页、查找元素等。

1、均使用WebDriver类实例对象来调用

该类中的属性和方法均使用WebDriver类实例对象来调用

二、初始化和关闭

1、__init__():初始化方法

指定参数,创建一个 WebDriver 实例。

def __init__(self, command_executor='http://127.0.0.1:4444/wd/hub',
                 desired_capabilities=None, browser_profile=None, proxy=None,
                 keep_alive=False, file_detector=None, options=None):

2、quit():关闭浏览器

关闭浏览器窗口并退出 WebDriver 会话

    def quit(self):
        """
        Quits the driver and closes every associated window.

        :Usage:
            driver.quit()
        """
        try:
            self.execute(Command.QUIT)
        finally:
            self.stop_client()

三、浏览器控制和导航

1、get():打开指定 URL 的网页

    def get(self, url):
        """
        Loads a web page in the current browser session.
        """
        self.execute(Command.GET, {'url': url})

2、back():浏览器回退

# Navigation
    def back(self):
        """
        Goes one step backward in the browser history.

        :Usage:
            driver.back()
        """
        self.execute(Command.GO_BACK)

3、forward():浏览器前进

    def forward(self):
        """
        Goes one step forward in the browser history.

        :Usage:
            driver.forward()
        """
        self.execute(Command.GO_FORWARD)

4、refresh():刷新当前页面

    def refresh(self):
        """
        Refreshes the current page.

        :Usage:
            driver.refresh()
        """
        self.execute(Command.REFRESH)

5、close():关闭当前页面

    def close(self):
        """
        Closes the current window.

        :Usage:
            driver.close()
        """
        self.execute(Command.CLOSE)

三、页面大小操控

1、maximize_window():页面最大化

 def maximize_window(self):
        """
        Maximizes the current window that webdriver is using
        """
        params = None
        command = Command.W3C_MAXIMIZE_WINDOW
        if not self.w3c:
            command = Command.MAXIMIZE_WINDOW
            params = {'windowHandle': 'current'}
        self.execute(command, params)

2、minimize_window():页面最小化

    def minimize_window(self):
        """
        Invokes the window manager-specific 'minimize' operation
        """
        self.execute(Command.MINIMIZE_WINDOW)

3、get_window_size():获取页面窗口尺寸,返回字典(dist)类型,需要输出到控制台

默认为当前窗口

    def get_window_size(self, windowHandle='current'):
        """
        Gets the width and height of the current window.

        :Usage:
            driver.get_window_size()
        """
        command = Command.GET_WINDOW_SIZE
        if self.w3c:
            if windowHandle != 'current':
                warnings.warn("Only 'current' window is supported for W3C compatibile browsers.")
            size = self.get_window_rect()
        else:
            size = self.execute(command, {'windowHandle': windowHandle})

        if size.get('value', None) is not None:
            size = size['value']

        return {k: size[k] for k in ('width', 'height')}

4、set_window_size(width=1000,height=500):设置页面窗口尺寸

默认为当前窗口

    def set_window_size(self, width, height, windowHandle='current'):
        """
        Sets the width and height of the current window. (window.resizeTo)

        :Args:
         - width: the width in pixels to set the window to
         - height: the height in pixels to set the window to

        :Usage:
            driver.set_window_size(800,600)
        """
        if self.w3c:
            if windowHandle != 'current':
                warnings.warn("Only 'current' window is supported for W3C compatibile browsers.")
            self.set_window_rect(width=int(width), height=int(height))
        else:
            self.execute(Command.SET_WINDOW_SIZE, {
                'width': int(width),
                'height': int(height),
                'windowHandle': windowHandle})

四、窗口句柄相关

1、window_handles:获取该浏览器实例的所有窗口句柄

类型:

@property
def window_handles(self) -> list[str]: ..

用法:

#['CDwindow-4CB655F513D67BC871298814EADA367D', 'CDwindow-64B341F83D427EC7D9C0311B7EB5D2FB']
print(self.driver.window_handles) 

2、current_window_handles:获取该浏览器实例的当前窗口句柄

类型:

@property
def current_window_handle(self) -> str: ...

用法:

current_window_handle = self.driver.current_window_handle
print("当前窗口句柄:",current_window_handle) #当前窗口句柄: CDwindow-6D784756870E777F33644F50C5BE6602
print("句柄类型为:",type(current_window_handle)) #句柄类型为: <class 'str'>

3、switch_to_window():在窗口句柄之间切换

类型:

def switch_to_window(self, window_name) -> None: ...

用法:

window_handles = self.driver.window_handles
for i in window_handles:
    self.driver.switch_to_window(i)
    sleep(2)
# # 获取当前页面的句柄:-----你家的门牌号
# handle = driver.current_window_handle
# # 打印handle数据类型以及值
# print(type(handle),handle)   # CDwindow-DC3B3842633BC9A5E181DEDD8E45387D
# # 1:两个窗口或者标签页切换
# # 定位超链接元素。点击------出现一个新的标签页    类似王阿姨家
# driver.find_element_by_xpath("//*[contains(text(),'精彩')]").click()
# sleep(3)
# # 此时浏览器中有两个窗口/标签页
# # 获取所有标签页的句柄
# all_handles = driver.window_handles   # 列表
# print(type(all_handles),all_handles)
# # 如果不进行窗口切换,定位第二个标签页的元素时,是否可以定位:经过验证是不可以定位的
# # 此时需要先进行切换,然后才可以定位到除了首页以外其他标签页上的元素
# # 实现窗口切换 window(para)  para形参传递就是需要切换到达的窗口的句柄
# driver.switch_to.window(all_handles[1])
# emt = driver.find_element_by_css_selector('[src="仙人模式动图.gif"]')
# print(emt.tag_name)
# 2:多个窗口或标签页切换
driver.find_element_by_xpath("//*[contains(text(),'精彩')]").click()   # 点击第一个链接   此时浏览器中有两个标签页
sleep(3)
driver.find_element_by_tag_name('strong').click()         # 点击第二链接    浏览器中有三个标签页
sleep(3)

# 获取所有标签页句柄
all_hanle = driver.window_handles   #  列表
print(all_hanle)
for i in all_hanle:    # 变量i从列表中第一个元素取到最后一个元素:迭代3次
    # print(driver.title)
    # 2):切换
    driver.switch_to.window(i)
    # 1):判断:标题栏信息是否是需要切换到达标签页标题
    if driver.title == "鸣人":

        emt = driver.find_element_by_css_selector('[src="仙人模式动图.gif"]')
        print(emt.tag_name)
        break

五、浏览器属性相关

1、name:获取当前浏览器实例的名称

类型:

@property
def name(self) -> str: ...

用法:

browser_name = self.driver.name
print(browser_name) #chrome

2、current_url:获取当前页面的URL

类型:

@property
def current_url(self) -> str: ...

用法:

current_url = self.driver.current_url
print("当前页面url:",current_url) #当前页面url: https://www.baidu.com/

3、title:获取当前页面标题

类型:

def title(self) -> str: ...

用法:

title = self.driver.title
print("当前页面标题:",title) #当前页面标题: 百度一下,你就知道

4、page_source:获取当前页面源码

类型:

@property
def page_source(self) -> str: ...

用法:

page_source = self.driver.page_source
print("当前页面源码:",page_source)

六、switch_to:用于切换模块相关

1、switch_to属性

类型:

@property
def switch_to(self) -> SwitchTo: ...

源码:

七、弹窗操作

1、switch_to.alert:返回当前页面上的Alert对象,可以用于处理JavaScript弹出框

相当于   switch_to_alert()

源码:

2、警告框

# (1)警告框
# 使用window对象中方法:alert()   弹框特点:有且只要一个确定按钮、
# 操作步骤
# 1)定位到alert弹框的按钮,点击
driver.find_element_by_id('button1').click()
sleep(3)
# 2)创建手
hand = driver.switch_to.alert
# 获取alert弹框上的文本信息
print(f"alert弹框上的文本信息是:{hand.text}")
# 点击alert弹框上确定按钮
hand.accept()

3、确认框

# (2)确认框
# 使用window对象中方法:confirm()   弹框特点:有一个确定按钮和取消按钮
# 操作步骤
# 1)定位确认框对应按钮,点击
driver.find_element_by_id('button2').click()
sleep(3)
# 2)创建手
hand = driver.switch_to.alert
# 获取confirm文本信息
print(hand.text)
# 点击confirm确定
# hand.accept()
# 点击取消
hand.dismiss()

4、消息提示框

# (3)消息提示框
# 使用window对象中方法:prompt()  弹框特点:有一个确定按钮和取消按钮,同时有一个可以接受用户输入的文本框
# 操作步骤
# 1)定位确认框对应按钮,点击
driver.find_element_by_id('button3').click()
sleep(3)
# 2)创建手
hand = driver.switch_to.alert
# 向消息提示框输入数据
hand.send_keys('我是一个prompt弹框')
# 点击确定
hand.accept()
sleep(3)
driver.quit()

八、切入iframe框架

1、通过id切入框架

    def switch_to_frame_by_id(self):
        #切入框架
        #① id进行切换
        # frame(para) para此时传递就是frame或者iframe标签的id属性值
        self.driver.switch_to.frame("secondIframe")
        self.driver.find_element_by_id("button2").click()
        sleep(2)
        self.driver.switch_to.alert.accept()
        sleep(3)
        self.driver.quit()

2、通过name切入框架

    def switch_to_frame_by_name(self):
        # ② name进行切换
        # frame(para) para此时传递就是frame或者iframe标签的name属性值
        self.driver.switch_to.frame("second")
        self.driver.find_element_by_id("button2").click()
        sleep(2)
        self.driver.switch_to.alert.accept()
        sleep(3)
        self.driver.quit()

3、通过索引index切入框架

    def switch_to_frame_by_index(self):
        # ③ 框架索引进行切换   框架索引从0开始
        # frame(para) para此时传递就是frame或者iframe标签的索引值
        self.driver.switch_to.frame(1)
        self.driver.find_element_by_id("button2").click()
        sleep(2)
        self.driver.switch_to.alert.accept()
        sleep(3)
        self.driver.quit()

4、通过元素webelement对象切入框架

    def switch_to_frame_by_webelement(self):
        # ④ 定位框架元素进行切换
        # 定位frame或者iframe标签元素
        # frame(para) para此时传递就是frame或者iframe标签元素
        emt = self.driver.find_element_by_css_selector('#FGridContainer+iframe')  # 相邻兄弟选择器
        # 进行框架切换
        self.driver.switch_to.frame(emt)  # frame(para) para此时传递就是frame或者iframe标签元素
        self.driver.find_element_by_id("button2").click()
        sleep(2)
        self.driver.switch_to.alert.accept()
        sleep(3)
        self.driver.quit()

九、切出iframe框架

1、通过parent_frame()切换至上一级

    def switch_to_frame_by_parent_frame(self):
        # 从最外层进入最里层:top进入third
        #    只能一层一层进入
        # top ---second
        self.driver.switch_to.frame('second')
        sleep(3)
        # second---thrid
        self.driver.switch_to.frame('third')
        sleep(3)
        # 定位最里层框架中超链接,并点击
        self.driver.find_element_by_id('atstudy').click()
        sleep(5)
        # 3.2 从最里层返回最外层
        # 一层一层返回
        # third ---second
        self.driver.switch_to.parent_frame()
        sleep(3)
        # # second----top
        self.driver.switch_to.parent_frame()
        self.driver.find_element_by_id('input').clear()
        sleep(3)
        self.driver.quit()

2、通过default_content()一次性切换至默认主框架

    def switch_to_frame_by_default_content(self):
        # 从最外层进入最里层:top进入third
        #    只能一层一层进入
        # top ---second
        self.driver.switch_to.frame('second')
        sleep(3)
        # second---thrid
        self.driver.switch_to.frame('third')
        sleep(3)
        # 定位最里层框架中超链接,并点击
        self.driver.find_element_by_id('atstudy').click()
        sleep(5)
        # 从最里层返回最外层
        # 一次性返回
        self.driver.switch_to.default_content()
        self.driver.find_element_by_id('input').clear()
        sleep(3)
        self.driver.quit()

第七章、WebElement类的常用属性和方法

一、概述

第八章、元素定位(WebDriver 和WebElement类的方法)

一、概述

        在 Selenium 的 Python 包中,webdriver.remote.webdriver.WebDriver 类是用于管理和控制远程浏览器会话的核心类。这个类提供了许多方法,其中之一就是 find_element() 方法,用于在页面上查找单个元素。

1、find_element方法返回WebElement对象(以WebDriver类为准)

类型:def find_element(self, by=..., value: Any | None = ...) -> WebElement: ...

2、find_elements方法返回WebElement对象数组(以WebDriver类为准)

类型:def find_elements(self, by=..., value: Any | None = ...) -> list[WebElement]: ...

3、共有八种定位方法

4、查看某个表达式能匹配到元素个数

5、NoSuchElementException 异常

需要注意的是,如果 find_element() 方法找不到对应的元素,将会抛出 NoSuchElementException 异常。因此,在使用该方法时,最好使用异常处理来处理找不到元素的情况。

二、  第一类:返回单一WebElement对象

1、有且仅有返回一个WebElement元素对象

如果在webui界面中,多个元素的同一属性的值是相同的,此时该类方法默认返回是匹配到的第一个元素对象

find_element() 方法会返回一个 WebElement 对象,表示找到的单个元素。你可以对返回的 WebElement 对象执行各种操作,如点击、输入文本等。

2、find_element() 方法

参数说明:

  • by:指定查找元素的方式,可以使用以下几种方式之一:
    • By.ID:根据元素的 ID 属性进行查找。
    • By.NAME:根据元素的 Name 属性进行查找。
    • By.CLASS_NAME:根据元素的 Class Name 属性进行查找。
    • By.TAG_NAME:根据元素的标签名进行查找。
    • By.CSS_SELECTOR:根据元素的css选择器进行查找
    • By.XPATH:根据 XPath 表达式进行查找。
    • By.LINK_TEXT:根据链接文本进行查找(用于 <a> 标签)。
    • By.PARTIAL_LINK_TEXT:根据链接文本的部分内容进行查找。
  • value:指定查找元素的值,例如元素的 ID、Name、XPath 表达式等。

3、find_element_by_id(“id属性值”)

通过id定位元素

id是唯一的,使用元素ID属性值进行定位,元素要有ID属性以及属性值

4、find_element_by_name(“name属性值”)

通过name属性名称定位元素

可能返回多个元素,返回第一个;使用元素Name属性值进行定位,元素要有name属性以及属性值

5、find_element_by_class_name(“class属性值”)

通过css class定位元素

  • class属性值没有空格:没有空格时,直接使用class属性值进行元素定位

  • class属性值有空格:必须使用class属性值中部分内容。(就是用空格分隔的那个部分内容)

6、find_element_by_link_text('全部超链接文本')

通过全部链接文本定位元素

7、find_element_by_partial_link_text('部分超链接文本')

通过部分链接文本定位元素

注意:在使用部分文本内容定位,部分文本内容必须连续        

8、find_element_by_tag_name('html标签名')

通过html标签名称定位元素

这个方法定位使用比较少。如果当前webui界面中某个元素的标签名在整个网页中是独一无二的,此时可以优先考虑使用这种方法

9、find_element_by_xpath('xpath路径')

如果html 元素 没有id class  name  标签定位的(重复的太多)
解决方案xpath定位

1、xpath概述

xpath:xml path language xml路径语言

  • XPTH 指就是html路径,编写xpath的原则是要唯一,它是根据当前这个元素在webui界面所处位置进行定位的,xpath:xml path language  xml路径语言。
  • 使用xml路径语言可以定位到当前网页中唯一元素或多个元素
  • xpath:xml路径语言,他是通过当前元素在网页中位置来进行定位的

2、html和xml区别和联系

        HTML(Hypertext Markup Language)和XML(eXtensible Markup Language)是两种用于表示和组织数据的标记语言,它们有一些共同点,但也有很多区别。

相似之处:

  1. 标记语言: HTML和XML都是标记语言,它们使用标记来描述文档的结构和内容。

  2. 元素和属性: 两者都使用元素和属性来组织和描述数据。元素是由标签包围的内容,而属性提供了有关元素的附加信息。

  3. 层次结构: HTML和XML文档都具有层次结构,其中元素可以嵌套在其他元素内部,形成树状结构。

  4. 扩展性: XML具有更大的扩展性,允许用户定义自己的元素和属性,而HTML的标记通常是预定义的,用于呈现文档内容。

不同之处:

  1. 用途不同: HTML主要用于创建Web页面,它具有固定的标记结构,用于定义文档的外观和布局。XML则没有特定的应用领域,它用于存储和交换数据,可以用于各种用途,如配置文件、数据传输和存储等。

  2. 语法严格性: HTML对语法的容忍度较高,浏览器通常可以处理包含错误的HTML代码。XML要求更严格的语法,任何不正确的标记都会导致解析错误。

  3. 预定义标签: HTML包含一组预定义的标签,用于创建文档的结构,如<p>(段落)、<div>(块级容器)等。XML没有预定义标签,用户需要自己定义标签和文档结构。

  4. 渲染和样式: HTML用于描述文档的外观和呈现方式,可以与CSS(层叠样式表)一起使用来定义样式。XML没有与之相关的呈现信息,它更关注数据的结构和内容。

  5. 命名空间: XML支持命名空间,允许在同一文档中使用来自不同来源的元素和属性,以避免名称冲突。HTML没有内置的命名空间支持。

        总的来说,HTML和XML都是标记语言,但它们的设计目标和应用领域不同。HTML用于呈现Web内容,具有较宽松的语法和预定义的标签,而XML更通用,用于表示和交换数据,具有更严格的语法和用户定义的标签。

html:超文本标记语言

xml:可扩展标记语言,markup language  标记语言

联系:html和xml是兄弟关系,都属于标记语言,成对出现(单标签除外)

区别:

  • html标记语言中的标签都是固定的,不可以自定义
  • xml标记语言中的标签用户可以自定义

html是前端标记语言,用于向客户来呈现数据信息

xml是存储或管理数据,不是前端语言,目前主要应用作为:配置文件或接口测试中前后数据交互

这两种标记语言都有各自使用领域,彼此是互相配合关系,谁也无法替代谁

xpath:xml路径语言,他是通过当前元素在网页中的位置来进行定位的。

3、绝对路径

绝对路径  必须以/html开头

绝对路径以 / 起始,从当前webui界面的根点(html)开始,向下去定位需要操作的元素

特点:表达式比较长,不便于维护,如果前端界面发生改变,绝对路径表达式失效,就定位不到对应元素了

def xpath_by_absolute_path(self):
        ele = self.driver.find_element_by_xpath("/html/body/div/div/div/div/div/div/ul/li/a")
        print(ele.text)
        sleep(2)
        self.driver.quit()

4、相对路径

  • 相对路径定位元素,使用//起始,表示要从匹配到的当前节点向下去选取文档中的节点
  • 不需要考虑操作元素与当前这个节点元素关系(可以是父子关系,可以兄弟关系,爷孙关系等等。)
  • 使用相对路径可能会定位到当前网页中多个元素,如果唯一操作某个元素时,可以结合索引
    • 索引都是从1开始的
    • //br[1]:表示定位是其父元素下的第一个br元素
    • (//br)[1]:表示定位是网页中的第一个br元素
  • ..和. 用法
    • //input/.   :表示定位当前元素
      //input/..   :表示定位当前元素的上一级

 selenium包下的webdriver包下的remote包下的webdriver模块下的WebDriver类中的switch_to系列方法详解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值