python的selenium模块_Python中Selenium模块的使用

目录

Selenium的介绍、配置和调用

Selenium(浏览器自动化测试框架) 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。

框架底层使用JavaScript模拟真实用户对浏览器进行操作。测试脚本执行时,浏览器自动按照脚本代码做出点击,输入,打开,验证等操作,就像真实用户所做的一样,从终端用户的角度测试应用程序。

使浏览器兼容性测试自动化成为可能,尽管在不同的浏览器上依然有细微的差别。

使用简单,可使用Java,Python等多种语言编写用例脚本。

Selenium的配置

1、安装 Selenium模块:  pip  install  Selenium

2、下载浏览器驱动,Selenium3.x调用浏览器必须有一个webdriver驱动文件

下载之后,解压到任意目录(路径不要有中文)。

Selenium的调用

from selenium import webdriver

## 如果是chrome浏览器的驱动

driver=webdriver.Chrome("G:\Anaconda3-5.3.0\chromedriver.exe")

##如果是firefox浏览器的驱动

driver=webdriver.Firefox(executable_path="G:\Anaconda3-5.3.0\geckodriver.exe")

######如果浏览器驱动的目录加入了环境变量的话

## 如果是chrome浏览器的驱动

driver=webdriver.Chrome()

##如果是firefox浏览器的驱动

driver=webdriver.Firefox()

Selenium的使用

定位

Selenium提供了8种定位方式

id

name

class  name

tag name

link text

partial link text

xpath

css selector

定位元素的使用

定位一个元素

定位多个元素

含义find_element_by_id

find_elements_by_id

通过元素id定位

find_element_by_name

find_elements_by_name

通过元素name定位

find_element_by_class_name

find_elements_by_class_name

通过classname进行定位

find_element_by_tag_name

find_elements_by_tag_name

通过标签定位

find_element_by_link_text

find_elements_by_link_tex

通过完整超链接定位

find_element_by_partial_link_text

find_elements_by_partial_link_text

通过部分链接定位

find_elements_by_css_selector

find_elements_by_css_selector

通过css选择器进行定位

find_element_by_xpath

find_elements_by_xpath

通过xpath表达式定位

例如:

百度一下

通过id进行定位第一个input框: find_element_by_id("key")

通过name进行定位第一个input框:find_element_by_name("username")

通过classname进行定位第一个input框:find_element_by_class_name("xie")

通过标签tag进行定位input框:find_element_by_tag_name("input")    //这里input太多了,用input标签定位会出错

通过完整超链接定位a标签: find_element_by_link_text("百度一下")

用xpath进行定位:

用绝对路径进行定位,input[1]代表form下面的第一个input标签,从1开始, input=input[1]

driver.find_elemant_by_xpath("//html/body/form/input[1]")

用相对路径进行定位,form标签下的第一个input标签,[1]省略了

driver.find_element_by_xpath("//form/input")

用相对路径和属性进行定位,form标签下的input标签的name值等于username的标签

driver.find_element_by_xpath("//form/input[@name='username']")

其他的属性值如果太长,也可以采取模糊方法定位

例如页面中有这么一个标签

百度一下

则可以这么使用

driver.find_element_by_xpath("//a[contains(@href,'login')]")

以上是普通的情况,存在可以定位的属性,当某个元素的各个属性及其组合都不足以定位时,我们可以利用其兄弟节点或者父节点等各种可以定位的元素进行定位,先看看xpath中支持的方法:

1、child  选取当前节点的所有子元素

2、parent  选取当前节点的父节点

3、descendant选取当前节点的所有后代元素(子、孙等)

4、ancestor  选取当前节点的所有先辈(父、祖父等)

5、descendant-or-self选取当前节点的所有后代元素(子、孙等)以及当前节点本身

6、ancestor-or-self  选取当前节点的所有先辈(父、祖父等)以及当前节点本身

7、preceding-sibling选取当前节点之前的所有同级节点

8、following-sibling选取当前节点之后的所有同级节点

9、preceding   选取文档中当前节点的开始标签之前的所有节点

10、following   选取文档中当前节点的结束标签之后的所有节点

11、self  选取当前节点

12、attribute  选取当前节点的所有属性

13、namespace选取当前节点的所有命名空间节点

上图实例,需要点击订单号为17051915200001的发货按钮,这时候不能直接定位到发货按钮,而是要先定位到订单号元素,再定位他的兄弟节点。参照上图,我们首先定位到td标签中包含订单号的td元素,然后选择其之后的同级节点,following-sibling,我们要找的元素在后面的第8个td标签下,因此定位可以写名为下面的格式

driver.find_element_by_xpath("//td[contains(text(),’17051915200001’)]/following-sibling::td[8]/a[@class='link']")

但是如果页面中有两个相同的定位元素的话,我们这样使用就有可能会报错

比如有下面两个输入框,一个输入用户名的,一个输入密码的,但是 class 都是等于 inputclass 。这时,如果我们使用class_name 来定位元素的话,就会出现意想不到的错误

#python代码

driver.find_element_by_class_name("inputclass").send_keys("admin")

driver.find_element_by_class_name("inputclass").send_keys("password")

我们的本意是在username框内输入admin,password框内输入 password 。但是由于两个框的 class 相同,而我们又是使用class_name进行元素的定位,所以我们所有的操作都会对第一个元素进行。

还有如果我们定位的元素页面没有的话,也会报错

比如我们使用这条语句用class_name来进行定位元素,但是当页面没有 class_name="aa" 的元素的话,就会报错,表示找不到通过 class name 方法找的元素 aa

driver.find_element_by_class_name("aa").send_keys("bb")

NoSuchElementException: no such element: Unable to locate element: {"method":"class name","selector":"aa"}

定位下拉标签元素

import Select

Select(driver.find_element_by_xpath("//select[@id='9560af43bfc949c4826d329c352e4eb6_class']")).select_by_index(4) #定位公共互联网环境

在iframe框架之间切换

#切换到指定的iframe框架

driver.switch_to.frame("mainFrame") #切换iframe框架

driver.switch_to.default_content() #切换到主框架

上传文件

上传文件使用的是AutoIt,安装好后,打开AutoIt Window Info,鼠标选中Finder Tool,然后鼠标左键按住拖到文件名框内,得到如图数据

然后鼠标选中Finder Tool,鼠标左键按住拖到打开按钮,得到如图数据

打开SciTE Script Editor,输入如下内容

WinWait("CLASS:#32770","",5) #设置5秒用于等待上传窗口的显示

ControlFocus("打开","","Edit1") #把输入焦点定位到上传文本框中

ControlSetText("打开","","Edit1","C:\Users\17250\Desktop\1.txt") #输入文件路径

Sleep(5000) #等待上传时间,单位毫秒

ControlClick("打开","","Button1"); #点击打开按钮,开始上传

保存为1.au3,点击Tools->Go运行。

然后打开Compile Script to .exe ,然后选中1.au3,它会自动将其转换为1.exe。

在python中使用

os.system("C:\\Users\\17250\\Desktop\\1.exe")

Webdriver模块的使用

控制浏览器操作的一些方法

方法

说明

set_window_size()

设置浏览器的大小

back()

控制浏览器后退

forward()

控制浏览器前进

refresh()

刷新当前页面

clear()

清除文本

send_keys (value)

模拟按键输入

click()

单击元素

submit()

用于提交表单

get_attribute(name)

获取元素属性值

is_displayed()

设置该元素是否用户可见

size

返回元素的尺寸

text

获取元素的文本

鼠标事件

在 WebDriver 中, 将这些关于鼠标操作的方法封装在 ActionChains 类提供。

方法

说明ActionChains(driver)

构造ActionChains对象

context_click()

执行鼠标悬停操作

move_to_element(above)

右击

double_click()

双击

drag_and_drop()

拖动

move_to_element(above)

执行鼠标悬停操作

context_click()

用于模拟鼠标右键操作, 在调用时需要指定元素定位

perform()

执行所有 ActionChains 中存储的行为,可以理解成是对整个操作的提交动作

键盘事件

Selenium中的Key模块为我们提供了模拟键盘按键的方法,那就是send_keys()方法。它不仅可以模拟键盘输入,也可以模拟键盘的操作。

常用的键盘操作如下:

模拟键盘按键

说明send_keys(Keys.BACK_SPACE)

删除键(BackSpace)

send_keys(Keys.SPACE)

空格键(Space)

send_keys(Keys.TAB)

制表键(Tab)

send_keys(Keys.ESCAPE)

回退键(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…Fn)

键盘 F1…Fn

获取断言信息

不管是在做功能测试还是自动化测试,最后一步需要拿实际结果与预期进行比较。这个比较的称之为断言。通过我们获取title 、URL和text等信息进行断言。

属性

说明title

用于获得当前页面的标题

current_url

用户获得当前页面的URL

text

获取搜索条目的文本信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551415.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

django使用mysql事务处理_Django中MySQL事务的使用

Django中事物的使用from django.db import transactiontransaction.atomic通过transaction的transaction.atomic装饰器来开启事务,在视图逻辑涉及数据库操作的地方添加事物保存点,在操作不满足时进行事物回滚,在操作满足是进行事物提交# 前端…

python学习笔记全过程_Python学习过程笔记整理(一)

编码方式-Utf8编码方式:# -*- coding: utf-8 -*-注释-行注释 #-块注释 ...或"""..."""基础语法-print()输出默认换行,不换行需要末尾加end""1 print("A",end"")2 print("B")-inp…

http安全 Java_HTTP通信安全-身份验证 | 字痕随行

无论是使用Web Service、RESTful或者其它的基于Http协议的交互方案,不可避免的都需要解决通信方面的安全问题,常见的无非就是:1. 明文传输密码。2. 重放攻击(相关概念参见《HTTP安全-重放攻击》)。3. 请求来源非法。本文通过SHA1算法加/解密相…

python爬取行业数据_用Python进行Web爬取数据

介绍我们拥有的数据太少,无法建立机器学习模型。我们需要更多数据!如果这句话听起来很熟悉,那么你并不孤单!希望获得更多数据来训练我们的机器学习模型是一个一直困扰人们的问题。我们无法在数据科学项目中获得可以直接使用的Exce…

gradle compile mysql_Gradle配置implementation、api与compile的区别

自Gradle 3.4开始,compile被废弃,取而代之的是implementation和api两个配置项。掌握这三者的区别实际上就是要清楚什么情况使用implementation替换compile,什么情况下使用api替换compile。implementation替换compile使用implementation配置依…

python偶数列表_使用条件偶数列表创建带有地图的元组 - python

这是我的代码:evenorodd[1,2,3]list1[a,b,c]list2[A,B,C]res tuple(map(lambda x: True if x % 2 ! 0 else False, evenorodd))print(res)输出:(False, True, False, True)我想要这个:如果x%2! 0则为list1的元素(如果evenorodd的元素为奇数)list2 else的元素(如果e…

java 获取子线程_Java 主线程获取子线程返回结果

1.自定义package com.jgyang.com;public class MySyncThreadTest {public static void main(String[] args) throws Exception {CustomRunnable cRunnacle new CustomRunnable();Thread thread new Thread(cRunnacle,"子线程");thread.start(); //子线程执行System…

winpythonhadoop_让python在hadoop上跑起来

本文实例讲解的是一般的hadoop入门程序“WordCount”,就是首先写一个map程序用来将输入的字符串分割成单个的单词,然后reduce这些单个的单词,相同的单词就对其进行计数,不同的单词分别输出,结果输出每一个单词出现的频…

java解析html jsoup_2020-06-02 jsoup java解析html

AJsoupAJsoup 模块是快速将html 转换成bean 类似gson转换使用前提你了解jsoup并且了解jsoup的SelectGradlecompile com.github.zdongcoding:ajsoup:0.1.0Mavencom.github.zdongcodingajsoup0.1.0pom使用方法如下:bean.javaSelect(select "body")public c…

串口工具securecrt_SecureCRT配置华为交换机部分命令

点上方蓝字“工控先生”免费快速关注本文由“135编辑由于工作需要,昨天临时需要从华为的光电交换机上面的console口查看一些端口的状态等,现整理如下,有需要的可以参考一下:硬件准备串口线,华为交换机连接将RJ45连接到…

java byte 二维数组_[编程入门]二维数组的转置-题解(Java代码)

解题思路:注意事项:参考代码:import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int[][] a new int[3][3];for(byte i 0; i for(byte j 0;j a[i][j] scanner.nextInt();}}for(byte i 1; i i…

如何让nginx执行python代码_生产环境部署Python语言代码(django+uwsgi+nginx)

本文主要向大家介绍了生产环境部署Python语言代码(djangouwsginginx),通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。基础环境不做介绍,在django开发web项目完成后,一直使用django自带的服务器进行调试&#xff1a…

天天向上续python3.3_Linux 配置系列 四 python3

一、环境准备JDK版本: jdk1.8; 操作系统: centos 7.6 ;Python::3.7.7; tomcat: apache-tomcat-8.5.5;二、配置python32.1 python3依赖包yum install gcc patch libffi-devel python-…

micropython用什么编译_micropython开发者指南

Authorshaniadolphin获取git工程mkdir micropythoncd micropythongit clone https://github.com/micropython/micropython.gitgit submodule update --init运行的结果如下:dolphinDESKTOP-DR5OKOG:/mnt/h/proj/micropython$ cd micropython/dolphinDESKTOP-DR5OKOG:…

java 跳转虚拟目录_java tomcat虚拟目录的深入了解

我们知道,Web网站中的内容(包括网页,图片,音频文件等)一般都存放在App的目录下。但随着网站内容的不断丰富,用户需要把不同层次的内容组织成网站的子目录。我们通常的做法是在网站主目录下新建子目录,并把相关的内容放…

redis工具类_SpringBoot 操作 Redis 数据

SpringBoot 操作 Redis 数据简介 Redis 是一个开源的NoSQL数据库,基于内存的键值存储,速度快。Redis 支持数据结构,如字符串,散列,列表,集和带范围查询的有序集。5种主要数据类型:字符串类型 …

java判断日期是否是同一周_JAVA里面怎样判断一个日期是否是星期六或者星期天,给出原代码,多谢!!!!!!!!!!...

分数全部奉上。|void test2(){String tmp "2001-09-02";SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd");try {Date myDate sdf.parse(tmp);Calendar myCalendar Calendar.getInstance();myCalendar.setTime(myDate);int i myCalendar.get(…

python中继承是什么意思_Python面向对象中的继承是什么意思

Python面向对象中的继承是什么意思发布时间:2020-11-09 14:05:42

python ansible模块_ansible常用模块

一、ansible常用模块模块是Ansible执行的最小单位,可以是由Python编写,也可以是Shell编写,也可以是由其他语言编写。一、ping模块测试连接可通性,没有参数。通的话返回pong。1、使用示例ansible all -m ping1、可通,返…

java断点续传 框架_java实现断点续传

用java的URL实现了一个简单的断点续传的列子,不为别的,假如你对断点续传不了解一看就明白了呵呵,算不上高深啊package test;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.io.Ra…