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操作(四)简单元素操作的更多相关文章

  1. Selenium 2自动化测试实战9(简单元素操作)

    一.简单元素操作 1. webdriver中常用的几个方法: clear():清除文本 send_keys(*value):模拟按键输入 click():单击元素 clear()方法用于清除文本输入框 ...

  2. selenium--控制浏览器和简单元素操作

    控制浏览器1.driver.maximize_window() #浏览器最大化2.driver.set_windows_size(480*800) #浏览器设置成移动端大小(480*800),参数数字 ...

  3. webdriervAPI(控制浏览器及简单元素操作)

    from  selenium  import  webdriver driver  =  webdriver.Chorme() driver.get("http://www.baidu.co ...

  4. ui自动化之selenium操作(五)简单元素操作--续

    1. 多窗口切换 有时候需要在多窗口切换,webdriver提供了switch_to_window()方法支持切换窗口: from selenium import webdriver import o ...

  5. UI自动化和selenium相关以及八大定位

    一.UI自动化相关 1. UI自动化的本质(重点) 定位元素→操作元素→模拟页面操作→断言→测试报告 2. 适合UI自动化的场景 UI自动化的前提条件 (1)需求不能频繁变动 (2)UI稳定(UI自动 ...

  6. D3.js系列——元素操作和简单画布操作

    一.元素操作: 1.选择元素 select 和 selectAll,以及选择集的概念 var p = d3.select("body").select("p") ...

  7. ui自动化之selenium操作(二)定位元素-简单操作

    1. 将浏览器最大化 这里拿chrome举例,但是我在执行的时候一直报错,被坑了好久; 解决办法: 这是因为chromedriver是和chrome一一对应的,不兼容的版本就会报错: 所有chrome ...

  8. ui自动化之selenium操作(三)xpath定位

    xpath 的定位方法,非常强大.使用这种方法几乎可以定位到页面上的任意元素. 1. 什么是xpath? xpath 是XML Path的简称, 由于HTML文档本身就是一个标准的XML页面,所以我们 ...

  9. ui自动化之selenium操作(一)环境搭建

    1. python安装: 前面步骤可以看到,这里就不赘述了(我们在这里安装的是python3) 2. selenium安装: 前面我们都已经安装好pip了,所以这里咱们直接进入到python安装路径的 ...

随机推荐

  1. vue项目如何部署到Tomcat中

    vue项目如何部署到Tomcat中 1,假设你要访问的项目名称为'hms' 2,在Tomcat的webapps下创建hms文件夹, 3,配置config/index.js文件,build: {} 选项 ...

  2. CAN波特率设置

    通过对CAN位定时寄存器CANBIT以及CAN波特率预分频扩展寄存器CANBRPE的设置可以得到需要的CAN通信波特率. CAN的位定时配置不当,将使得CAN模块无法按照目标波特率接入CAN网络,将导 ...

  3. leetcode 140 单词拆分2 word break II

    单词拆分2,递归+dp, 需要使用递归,同时使用记忆化搜索保存下来结果,c++代码如下 class Solution { public: //定义一个子串和子串拆分(如果有的话)的映射 unorder ...

  4. leetcode 51 N皇后问题

    代码,由全排列转化而来,加上剪枝,整洁的代码: 共有4个变量,res(最终的结果),level,当前合理的解,n皇后的个数,visit,当前列是否放过皇后,由于本来就是在新的行方皇后,又通过visit ...

  5. 字典的常见操作<一>

    <1>修改元素 字典的每个元素中的数据是可以修改的,只要通过key找到,即可修改 Demo from pip._vendor.distlib.compat import raw_input ...

  6. HTML+CSS实现导航栏二级下拉菜单完整代码

    工具是vs code 代码如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset ...

  7. 【HANA系列】SAP UI5上传图片 用XSJS存储在HANA中的方法

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP UI5上传图片 用XSJ ...

  8. 深入理解java:3. NIO 编程

    I/O简介 I/O即输入输出,是计算机与外界世界的一个借口. IO操作的实际主题是操作系统. 在Java编程中,一般使用流的方式来处理IO,所有的IO都被视作是单个字节的移动,通过stream对象一次 ...

  9. POJ2387 Til the Cows Come Home (最短路 dijkstra)

    AC代码 POJ2387 Til the Cows Come Home Bessie is out in the field and wants to get back to the barn to ...

  10. python-day18(正式学习)

    目录 numpy模块 numpy简介 为什么要用numpy 创建numpy数组 numpy数组的基本属性 获取numpy数组的行列数 切割numpy数组 numpy数组元素替换 numpy数组的合并 ...