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>
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;100%" id="ifme" src="http://www.baidu.com"></iframe> </body> </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()