ui自动化之selenium操作(四)简单元素操作
1. clear()
clear()方法用于清除文本输入框内的内容;一般输入框中都有默认文字,如果不清空有可能会导致字符拼接;
browser.find_element(By.ID,"userId").clear()
2. send_keys(*value)
send_keys()方法模拟键盘输入向输入框内输入内容。
browser.find_element(By.ID,"userId").send_keys("测试")
3. click()
click()方法可以用来单击一个按钮,前提是它是可以被点击元素;还可以单击文字/图片链接、复选框、单选框,甚至是下拉框等;
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
browser = webdriver.Chrome()
#访问百度
browser.get("http://www.baidu.com")
time.sleep(2)
browser.find_element_by_xpath("//*[@id='u1']/a[7]").click()
下面实现一个登录操作:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
browser = webdriver.Chrome()
#访问百度
browser.get("http://login.tiantian.com")
time.sleep(2)
browser.find_element_by_id("userId").clear()
browser.find_element_by_id("userId").send_keys("123123123")
browser.find_element_by_id("passWord").clear()
browser.find_element_by_id("passWord").send_keys("123123123")
browser.find_element_by_xpath("//*[@id='unLoginHeight']/div[6]/input").click() time.sleep(5) #关闭浏览器
browser.quit()
4. submit()
submit()方法用于提交表单,特别用于没有提交按钮的情况;例如搜索框输入关键字之后的"回车"操作,就可以直接用submit()提交搜索框的内容;
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
browser = webdriver.Chrome()
#访问百度
url = "http://www.baidu.com"
browser.get(url)
time.sleep(2)
browser.find_element_by_id("kw").send_keys("测试")
browser.find_element_by_id("kw").submit()
time.sleep(5)
#关闭浏览器
browser.quit()
5. 鼠标操作
通过上面的例子我们可以使用click()来模拟鼠标的单击操作;而在实际工作中,我们还会用到右击、双击、鼠标悬停、鼠标拖动等操作;在webdirver中这些关于鼠标操作的方法由ActionChains类提供;
perform() 执行所有ActionChains中存储的行为;
- context_click() 右击;
- double_click() 双击;
- drag_and_drop() 拖动;
- move_to_element() 鼠标悬停;
5.1 右击
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
#定位到要右击的元素
right_click = driver.find_element_by_id("kw")
#对定位到的元素执行鼠标右键操作
ActionChains(driver).context_click(right_click).perform()
5.2 双击
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
#定位到要操作的元素
double_click = driver.find_element_by_id("kw")
#对定位到的元素执行鼠标双击操作
ActionChains(driver).double_click(double_click).perform()
5.3 拖动
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
#定位到要操作的源位置
element = driver.find_element_by_name("XXXX")
#定位到要移动到的目标位置
target = driver.find_element_by_name("XXXX")
#对定位到的元素执行鼠标双击操作
ActionChains(driver).drag_and_drop(element,target).perform()
drag_and_drop(source,target) 在源元素上按下鼠标左键,然后移动到目标元素释放。
# source 鼠标拖动的源元素
# target 鼠标释放的目标元素
5.4 鼠标悬停
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
#定位到要操作的元素
above = driver.find_element_by_xpath("//*[@id='u1']/a[9]")
#对定位到的元素执行鼠标双击操作
ActionChains(driver).move_to_element(above).perform()
6. 键盘操作
有时候我们需要用到键盘操作;Keys类提供键盘上几乎所有按键的方法;
1. 导入Keys类:
from selenium.webdriver.common.keys import Keys
2. 输入框输入内容
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.find_element_by_id('kw').send_keys(u"测试猿")
3. 删除一个字
driver.find_element_by_id('kw').send_keys(Keys.BACK_SPACE)
4. 添加空格+字
driver.find_element_by_id('kw').send_keys(Keys.SPACE)
driver.find_element_by_id('kw').send_keys(u"工程师")
5. 全选输入框内容
driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'a')
6. 剪切
driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'x')
7. 复制
driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'v')
8. 回车
driver.find_element_by_id('su').send_keys(Keys.ENTER)
9. 其他
#Esc键
driver.find_element_by_id('kw').send_keys(Keys.ESCAPE)
#Tab键
driver.find_element_by_id('kw').send_keys(Keys.TAB)
#F1键
driver.find_element_by_id('kw').send_keys(Keys.F1)
7. 验证信息
执行自动化测试时我们可以通过页面获取一些信息来判断是否执行成功;常用方法为:title、url和text;
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
import time
browser = webdriver.Chrome()
#访问百度
url = "http://www.163.com"
browser.get(url)
title = browser.title
print(title)#打印当前页面标题
now_url = browser.current_url
print(now_url)#当前当前url #执行登录操作
browser.find_element_by_id("userId").clear()
browser.find_element_by_id("userId").send_keys("username")
browser.find_element_by_id("passWord").clear()
browser.find_element_by_id("passWord").send_keys("password")
browser.find_element_by_xpath("XXXX").click() title = browser.title
print('------登录后-------')
print(title)#打印当前页面标题
now_url = browser.current_url
print(now_url)#当前当前url time.sleep(5)
#关闭浏览器
browser.quit()
8. 设置元素等待
我们在定位元素时可能会发现一个问题:切换到页面时有时页面正在加载,定位元素就有可能定位不到,导致自动化脚本不稳定;
这里我们就需要用到webdriver提供的等待方式:强制等待、显式等待和隐式等待;
8.1 强制等待
第一种也是最简单粗暴的一种办法就是强制等待sleep(xx),这个咱们在前面已经了解过;
sleep(5)
8.2 隐式等待
第二种办法叫隐性等待,implicitly_wait(xx);
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(30) # 隐性等待,最长等30秒
driver.get('http://www.baidu.com')
print driver.current_url
driver.quit()
隐形等待是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。
注意这里有一个弊端,那就是程序会一直等待整个页面加载完成,也就是一般情况下你看到浏览器标签栏那个小圈不再转,才会执行下一步,但有时候页面想要的元素早就在加载完成了,因为个别js之类的东西特别慢,我仍得等到页面全部完成才能执行下一步,我想等我要的元素出来之后就下一步怎么办?
有办法,这就要看selenium提供的另一种等待方式——显性等待wait了。
需要特别说明的是:隐性等待对整个driver的周期都起作用,所以只要设置一次即可,我曾看到有人把隐性等待当成了sleep在用,走哪儿都来一下…
8.3 显式等待
第三种办法就是显性等待,WebDriverWait,配合该类的until()和until_not()方法,就能够根据判断条件而进行灵活地等待了。
它主要的意思就是:程序每隔xx秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException。
这里我们主要用到WebDriverWait类与expected_conditions模块;
- WebDriverWait
wait模块的WebDriverWait类是显性等待类,先看下它有哪些参数与方法:
selenium.webdriver.support.wait.WebDriverWait(类)
__init__
driver: 传入WebDriver实例,即我们上例中的driver
timeout: 超时时间,等待的最长时间(同时要考虑隐性等待时间)
poll_frequency: 调用until或until_not中的方法的间隔时间,默认是0.5秒
ignored_exceptions: 忽略的异常,如果在调用until或until_not的过程中抛出这个元组中的异常,则不中断代码,继续等待,如果抛出的是这个元组外的异常,则中断代码,抛出异常。默认只有NoSuchElementException。
until
method: 在等待期间,每隔一段时间调用这个传入的方法,直到返回值不是False
message: 如果超时,抛出TimeoutException,将message传入异常
until_not 与until相反,until是当某元素出现或什么条件成立则继续执行,until_not是当某元素消失或什么条件不成立则继续执行,参数也相同,不再赘述。
method
message
调用方法:
WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息)
在这里,可以用selenium提供的 expected_conditions 模块中的各种条件,也可以用WebElement的 is_displayed() 、is_enabled()、is_selected() 方法,或者用自己封装的方法都可以,那么接下来我们看一下selenium提供的条件有哪些;
expected_conditions
expected_conditions是selenium的一个模块,其中包含一系列可用于判断的条件:
selenium.webdriver.support.expected_conditions(模块) #1. 这两个条件类验证title,验证传入的参数title是否等于或包含于driver.title
title_is
title_contains #2. 这两个条件验证元素是否出现,传入的参数都是元组类型的locator,如(By.ID, 'kw')
顾名思义,一个只要一个符合条件的元素加载出来就通过;另一个必须所有符合条件的元素都加载出来才行
presence_of_element_located
presence_of_all_elements_located #3. 这三个条件验证元素是否可见,前两个传入参数是元组类型的locator,第三个传入WebElement ;第一个和第三个其实质是一样的
visibility_of_element_located
invisibility_of_element_located
visibility_of #4. 这两个条件判断某段文本是否出现在某元素中,一个判断元素的text,一个判断元素的value
text_to_be_present_in_element
text_to_be_present_in_element_value #5. 这个条件判断frame是否可切入,可传入locator元组或者直接传入定位方式:id、name、index或WebElement
frame_to_be_available_and_switch_to_it #6. 这个条件判断是否有alert出现
alert_is_present #7. 这个条件判断元素是否可点击,传入locator
element_to_be_clickable #8. 这四个条件判断元素是否被选中,第一个条件传入WebElement对象,第二个传入locator元组
,第三个传入WebElement对象以及状态,相等返回True,否则返回False
,第四个传入locator以及状态,相等返回True,否则返回False
element_to_be_selected
element_located_to_be_selected
element_selection_state_to_be
element_located_selection_state_to_be #9. 这个条件判断一个元素是否仍在DOM中,传入WebElement对象,可以判断页面是否刷新了
staleness_of
9. 定位一组元素
前面咱们已经学会了几种定位方法,不过这些都是针对单元素定位的;针对一组元素定位就需要用到以下几种方法:
driver.find_elements_by_id()
driver.find_elements_by_name()
driver.find_elements_by_tag_name()
driver.find_elements_by_class_name()
driver.find_elements_by_css_selector()
driver.find_elements_by_link_text()
driver.find_elements_by_partial_link_text()
driver.find_elements_by_xpath()
定位一组元素一般来说可用于以下场景:
1)批量操作对象;
2)先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象(比如定位出所有的checkbox,然后选择最后一个)
举例:
先自己写一个html文件,然后进行定位:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div class="center">
<div class="c1">
<input type="checkbox"/>北京
</div>
<div class="c2">
<input type="checkbox"/>南京
</div>
<div class="c3">
<input type="checkbox"/>东京
</div>
</div>
</body>
</html>
input_text.html
from selenium import webdriver
import os,time
driver = webdriver.Chrome()
file_path = 'file:///'+ os.path.abspath("input_test.html")
driver.get(file_path)
inputs = driver.find_elements_by_tag_name("input")#找到所有input标签
for i in inputs:#找到所有checkbox类型的input标签,点击勾选
if i.get_attribute('type') == "checkbox":
i.click()
time.sleep(5)
driver.find_elements_by_tag_name("input").pop().click()#去掉最后一个标签的勾选
driver.quit()
10. 多表单切换
web应用经常碰到frame嵌套页面的情况,webdriver每次只能在一个页面上识别元素,对于frame嵌套的页面上的元素,直接定位是定位不到的;我们就需要借助于switch_to_frame()方法将当前定位的主题切换到frame内;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<iframe style="height:1000px;width:100%" id="ifme" src="http://www.baidu.com"></iframe>
</body>
</html>
iframe_test.html
如果我们直接去定位id为kw,会报错;
from selenium import webdriver
import os,time
driver = webdriver.Chrome()
file_path = 'file:///'+ os.path.abspath("iframe_test.html")
driver.get(file_path)
driver.find_element_by_id("kw").send_keys("测试")
应如下操作:
from selenium import webdriver
import os,time
driver = webdriver.Chrome()
file_path = 'file:///'+ os.path.abspath("iframe_test.html")
driver.get(file_path)
driver.switch_to_frame("ifme")
driver.find_element_by_id("kw").send_keys("测试")
switch_to_frame()默认可以直接取表单的id或name属性进行切换;如果没有id和name属性,name只能通过下面的方法定位:
from selenium import webdriver
import os,time
driver = webdriver.Chrome()
file_path = 'file:///'+ os.path.abspath("test.html")
driver.get(file_path)
#先通过xpath定位到iframe
xf = driver.find_element_by_xpath('//*[@class="ifme"]')
#再将定位对象传给switch_to_frame()方法
driver.switch_to_frame(xf)
#返回到上一层表单,默认对应与他最近的switch_to_frame()方法
driver.switch_to_default_content()
ui自动化之selenium操作(四)简单元素操作的更多相关文章
- Selenium 2自动化测试实战9(简单元素操作)
一.简单元素操作 1. webdriver中常用的几个方法: clear():清除文本 send_keys(*value):模拟按键输入 click():单击元素 clear()方法用于清除文本输入框 ...
- selenium--控制浏览器和简单元素操作
控制浏览器1.driver.maximize_window() #浏览器最大化2.driver.set_windows_size(480*800) #浏览器设置成移动端大小(480*800),参数数字 ...
- webdriervAPI(控制浏览器及简单元素操作)
from selenium import webdriver driver = webdriver.Chorme() driver.get("http://www.baidu.co ...
- ui自动化之selenium操作(五)简单元素操作--续
1. 多窗口切换 有时候需要在多窗口切换,webdriver提供了switch_to_window()方法支持切换窗口: from selenium import webdriver import o ...
- UI自动化和selenium相关以及八大定位
一.UI自动化相关 1. UI自动化的本质(重点) 定位元素→操作元素→模拟页面操作→断言→测试报告 2. 适合UI自动化的场景 UI自动化的前提条件 (1)需求不能频繁变动 (2)UI稳定(UI自动 ...
- D3.js系列——元素操作和简单画布操作
一.元素操作: 1.选择元素 select 和 selectAll,以及选择集的概念 var p = d3.select("body").select("p") ...
- ui自动化之selenium操作(二)定位元素-简单操作
1. 将浏览器最大化 这里拿chrome举例,但是我在执行的时候一直报错,被坑了好久; 解决办法: 这是因为chromedriver是和chrome一一对应的,不兼容的版本就会报错: 所有chrome ...
- ui自动化之selenium操作(三)xpath定位
xpath 的定位方法,非常强大.使用这种方法几乎可以定位到页面上的任意元素. 1. 什么是xpath? xpath 是XML Path的简称, 由于HTML文档本身就是一个标准的XML页面,所以我们 ...
- ui自动化之selenium操作(一)环境搭建
1. python安装: 前面步骤可以看到,这里就不赘述了(我们在这里安装的是python3) 2. selenium安装: 前面我们都已经安装好pip了,所以这里咱们直接进入到python安装路径的 ...
随机推荐
- 半硬化树脂PP的型号
1080是PP半固化胶片的型号(perperg),还有7628,2116,2113,2112,1506等等型号,每种型号不一样代表其PP内部的玻纤布不一样,比如7628的玻纤布相对较粗.数值较小则玻纤 ...
- 解决Prism中Region的GetView不起作用问题
通常情况下在Region中添加View时我们需要先判断View是否在Region中已存在,但如果我们在Region.Add的方法调用不当时,我们在GetView中始终返回Null,原因自然是Add时出 ...
- 十三:jinja2过滤器之default过滤器和or过滤器
在模板里面有时候需要对传过来的数据进行一些处理,jinja2有一些内置的过滤器可以进行处理.类似于python内置函数,通过 “|” 进行使用,详见jinja2官方文档 使用方法:{{ 变量名|过滤器 ...
- Redis 常用命令 大全
Redis 常用命令 发现几个很好的 Redis 常用命令汇总大全网页,分享给小伙伴们~ 1.Redis 命令参考 http://redisdoc.com/string/index.html 2.W3 ...
- Eclipse_Package Presentation
Package Presentation ->Flat ->Hierarchical更常用
- 我们公司的delphi代码(胆不是我写的!),看看,你觉得怎么样
unit unt_LotBill_dyc; interface uses windows, SysUtils, Classes, ComCtrls, Forms, Controls, StrUtils ...
- Oracle 归档日志管理
一.Oracle日志介绍 1.Oracle日志分类 分三大类: Alert log files--警报日志,Trace files--跟踪日志(用户和进程)和 redo log ...
- 快速安装pycharm,最详细的pycharm安装图文教程
大家都知道python的开发工具Pycharm吧,它是由JetBrains打造的一款Python IDE,它功能强大,已经是python开发者使用最多的编辑工具.首先,它支持多平台(Linux.WIn ...
- java中String中的endsWith()方法
解释:endsWith() ——此方法测试字符串是否以指定的后缀 suffix 结束. 此方法的定义:public boolean endsWith(String suffix) 我这里判断的是路径是 ...
- 【Python开发】【神经网络与深度学习】网络爬虫之图片自动下载器
python爬虫实战--图片自动下载器 之前介绍了那么多基本知识[Python爬虫]入门知识(没看的赶紧去看)大家也估计手痒了.想要实际做个小东西来看看,毕竟: talk is cheap show ...