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. leetcode 135分发糖果

    这是一道hard题,不好想,但最后还是想出来了,私以为还是根据一些思想方法自己想出来做法印象比较深刻,其次看人家的做法思想自己写代码,其次看代码理解默写,其次直接抄代码: 首先,给每个孩子都发一个糖果 ...

  2. 通过Precision/Recall判断分类结果偏差极大时算法的性能

    当我们对某些问题进行分类时,真实结果的分布会有明显偏差. 例如对是否患癌症进行分类,testing set 中可能只有0.5%的人患了癌症. 此时如果直接数误分类数的话,那么一个每次都预测人没有癌症的 ...

  3. apache配置静态缓存

    配置静态缓存:节省带宽,加快访问速度,提高用户体验.<IfModule mod_expires.c> ExpiresActive on ExpiresByType image/gif &q ...

  4. Tensorflow 安装 和 初识

    Windows中 Anaconda,Tensorflow 和 Pycharm的安装和配置   https://blog.csdn.net/zhuiqiuzhuoyue583/article/detai ...

  5. 【HANA系列】SAP HANA的ini文件存储路径

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA的ini文件存储 ...

  6. cocos2dx[3.2](10) 新回调函数std::bind

    在2.x中处理事件需要用到委托代理(delegate),相信学过2.x的触摸事件的同学,都知道创建和移除的流程十分繁琐. 而在3.x中由于加入了C++11的特性,而对事件的分发机制通过事件分发器Eve ...

  7. 【神经网络与深度学习】Caffe训练执行时爆出的Check failed: registry.count(t ype) == 1 (0 vs. 1) Unknown layer type

    自己建立一个工程,希望调用libcaffe.lib ,各种配置好,也能成功编译,但是运行就会遇到报错 F0519 14:54:12.494139 14504 layer_factory.hpp:77] ...

  8. 【miscellaneous】北斗短报文

    北斗系统最大的特色在于有源定位和短报文特色服务,不止解决了中国有无卫星导航系统的问题,还能将短信和导航结合,是中国北斗卫星导航系统的独特发明,也是一大优势. 北斗的短报文功能,在国防.民生和应急救援等 ...

  9. 第七次学习总结&&第五次实验报告

    一.实验目的 (1)理解抽象类与接口的使用: (2)了解包的作用,掌握包的设计方法. 二.实验要求 (1)掌握使用抽象类的方法. (2)掌握使用系统接口的技术和创建自定义接口的方法. (3)了解 Ja ...

  10. Oracle 查看 impdp 正在执行的内容

    1. 今天进行数据库备份恢复 一直卡住  找了一下 公司另外一个部门的方神提供了一个方法连查看 具体在做什么操作: 2. 现象. impdp 到一个地方直接卡住不动 具体位置 view 这个地方足足卡 ...