Selenium API(一)
1.设置浏览器大小
# -*- coding:utf-8 -*- from selenium import webdriver import time driver = webdriver.Firefox() url = "http://www.baidu.com" driver.maximize_window() # 设置浏览器大小:全屏 driver.get(url) time.sleep(3) driver.set_window_size(600, 600) # 高和宽分别是600 600
2.控制浏览器前进和后退
# -*- coding:utf-8 -*- from selenium import webdriver import time driver = webdriver.Firefox() driver.get("http://www.baidu.com") time.sleep(3) driver.get("http://www.sogou.com") time.sleep(3) driver.back() # 后退 time.sleep(3) driver.forward() # 前进 time.sleep(3) driver.quit() # 关闭浏览器
3.刷新浏览器
# -*- coding:utf-8 -*- from selenium import webdriver import time driver = webdriver.Firefox() driver.get("http://www.baidu.com") time.sleep(3) driver.refresh() # 刷新浏览器 time.sleep(3) driver.quit() # 关闭浏览器
4.输入内容,清空内容,点击按钮
# -*- coding:utf-8 -*- from selenium import webdriver import time driver = webdriver.Firefox() driver.get("http://www.baidu.com") driver.find_element_by_id("kw").send_keys("selenium") # 百度搜索输入框中输入selenium time.sleep(1) driver.find_element_by_id("kw").clear() # 清空百度搜索输入框内容 time.sleep(1) driver.find_element_by_id("kw").send_keys("python") # 百度搜索输入框中输入python time.sleep(1) # driver.find_element_by_id("su").click() # 点击百度搜索按钮 driver.find_element_by_id("su").submit() # 点击百度搜索按钮 time.sleep(2) driver.quit() # 关闭浏览器
说明:
(1)send_keys()方法模拟键盘向输入框里输入内容,除此之外,还可以用来发送键盘按键,甚至模拟文件上传;
(2)clear()方法用来清除文本输入框中的内容;
(3)click()方法用来单击一个元素,除此之外,还可以单击文字/图片链接,复选框,单选框,下拉框等;
(4)submit()方法用于提交表单,submit()应用范围不如click()。
5.获取页面信息
# -*- coding:utf-8 -*- from selenium import webdriver import time driver = webdriver.Firefox() driver.get("http://www.baidu.com") time.sleep(2) print(driver.title) # 输出页面的标题 print(driver.current_url) # 输出页面的url地址 print(driver.find_element_by_id("kw").size) # 输出元素的尺寸 print(driver.find_element_by_id("kw").get_attribute("class")) # 输出元素的属性值 print(driver.find_element_by_css_selector("a[name='tj_trnews']").text) # 输出文本值 print(driver.find_element_by_css_selector("#kw").is_displayed()) # 元素是否可见 driver.quit() # 关闭浏览器 -------输出结果------- 百度一下,你就知道 https://www.baidu.com/ {'width': 500.0, 'height': 22.0} s_ipt 新闻 True
6.鼠标操作
在WebDriver中,关于鼠标操作的方法被封装在了
from selenium.webdriver.common.action_chains import ActionChains
a.鼠标右键
对百度首页的新闻链接鼠标右键操作
# -*- coding:utf-8 -*- from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains import time driver = webdriver.Firefox() driver.get("http://www.baidu.com") time.sleep(2) ActionChains(driver).context_click(driver.find_element_by_link_text("新闻")).perform() # 点击鼠标右键 time.sleep(2) driver.quit() # 关闭浏览器
说明:
(1)ActionChain(driver) 调用ActionChain类,将浏览器驱动driver作为参数传入。
(2)context_click(news) 模拟鼠标右键操作,调用时需要指定元素定位。
(3)perform() 执行所有ActionChain中存储的行为,将整个操作进行提交。
b.鼠标悬停
# -*- coding:utf-8 -*- from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains import time driver = webdriver.Firefox() driver.get("http://www.baidu.com") time.sleep(2) ActionChains(driver).move_to_element(driver.find_element_by_link_text("新闻")).perform() # 鼠标悬停 time.sleep(2) driver.quit() # 关闭浏览器
说明:move_to_element()模拟鼠标悬停操作。
c.鼠标双击
news = driver.find_element_by_css_selector("xx") ActionChains(driver).double_click(news).perform()
d.鼠标拖动
source = driver.find_element_by_css_selector("xx") target = driver.find_element_by_css_selector("xx") ActionChains(driver).drag_and_drop(source, target).perform()
drag_and_drop()拖动,source:开始位置,需要拖动的元素,target:结束位置,拖放后需要放置的目的地。
7.键盘操作
Keys类提供了键盘上几乎所有的按键的方法,send_keys()用来模拟键盘输入,还可以用来输入键盘上的按键,甚至是组合键。在使用Keys类之前首先使用引入:
from selenium.webdriver.common.keys import Keys
# -*- coding:utf-8 -*- from selenium import webdriver from selenium.webdriver.common.keys import Keys import time driver = webdriver.Firefox() driver.get("http://www.baidu.com") time.sleep(2) driver.find_element_by_id("kw").send_keys("seleniumm") time.sleep(1) driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE) time.sleep(1) driver.find_element_by_id("kw").send_keys("软件测试") driver.find_element_by_id("kw").send_keys(Keys.CONTROL, "A") time.sleep(1) driver.find_element_by_id("kw").send_keys(Keys.CONTROL, "X") time.sleep(1) driver.find_element_by_id("kw").send_keys(Keys.CONTROL, "V") time.sleep(1) driver.quit() # 关闭浏览器
8.设置元素等待
WebDriver提供了两种类型的等待:显式等待和隐式等待。
a.显式等待
显式等待使WebDriver等待某个条件成立时继续执行,否则在达到最大时长时抛弃超时异常,在使用显式等待时需要引入WebDriverWait:
from selenium.webdriver.support.ui import WebDriverWait
如下,每隔0.5s检查当前页面中是否有id值为kw的元素,有则继续执行,超过5s,没有找到元素,则抛出异常。
# -*- coding:utf-8 -*- from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By driver = webdriver.Firefox() driver.get("http://www.baidu.com") element = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, "kw"))) element.send_keys("selenium")
在设置的等待时间内,每隔一段时间检查当前页面元素是否存在,存在则继续执行,不存在则报异常。
WebDriverWait(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None)
其中:
driver:浏览器驱动
timeout:超时时间,单位为秒
poll_frequency:每隔多长时间检查元素是否存在,默认为0.5s
ignored_exceptions:超时后的异常信息,NoSuchElementException
实际中WebDriverWait()一般与until()或until_not()方法配合使用。
until(method, message='') 调用该方法提供的驱动程序作为一个参数,直到返回值为True until_not(method, message='')
调用该方法提供的驱动程序作为一个参数,直到返回值为False
expected_conditions类的方法可以判断元素是否存在:
方法 | 说明 |
title_is | 判断当前页面的标题是否等于预期 |
title_contains | 判断当前页面的标题是否包含预期字符串 |
presence_of_element_located | 判断指定元素是否加载出来 |
presence_of_all_elements_located | 判断所有元素是否加载完成 |
visibility_of_element_located | 判断某个元素是否可见. 可见代表元素非隐藏,并且元素的宽和高都不等于0,传入参数是元组类型的locator |
visibility_of | 判断元素是否可见,传入参数是定位后的元素WebElement |
invisibility_of_element_located | 判断某个元素是否不可见,或是否不存在于DOM树 |
text_to_be_present_in_element | 判断元素的 text 是否包含预期字符串 |
text_to_be_present_in_element_value | 判断元素的 value 是否包含预期字符串 |
frame_to_be_available_and_switch_to_it | 判断该表单是否可以切换进去,可以,返回True并且switch进去,否则,返回False |
alert_is_present | 判断是否有alert出现 |
element_to_be_clickable | 判断元素是否可点击 |
element_to_be_selected | 判断某个元素是否被选中,一般用于下拉列表 |
element_selection_state_to_be | 判断元素的选中状态是否和预期一致,传入参数:定位后的元素,相等返回True,否则返回False |
element_located_selection_state_to_be | 判断元素的选中状态是否和预期一致,传入参数:元素的定位,相等返回True,否则返回False |
staleness_of | 等到一个元素从DOM树中移出 |
b.隐式等待
1 # -*- coding:utf-8 -*- 2 from selenium import webdriver 3 4 driver = webdriver.Firefox() 5 driver.implicitly_wait(10) # 隐式等待10秒 6 driver.get("http://www.baidu.com") 7 8 9 input_box = driver.find_element_by_css_selector("#kw") 10 input_box.send_keys("selenium")
说明:implicitly_wait()默认的参数的单位为秒,这里设置的时间并不是一个固定的时间,隐式等待是对页面中所有元素定位起作用,当脚本执行到某个元素定位时,如果元素可定位,则继续执行,如果不可定位,则会进行等待,最大等待时间为这里设置的时间,如果超过最大设置时间仍然没有定位到元素,则会抛异常。
显式等待和隐式等待的区别是显示等待只对进行判断的某一个元素起作用;隐式等待是对所有的元素定位起作用。
c.sleep休眠
sleep方法可以让脚本等待固定的时间,需要引入time模块。
1 # -*- coding:utf-8 -*- 2 from selenium import webdriver 3 import time 4 driver = webdriver.Firefox() 5 driver.get("http://www.baidu.com") 6 7 time.sleep(2) 8 input_box = driver.find_element_by_css_selector("#kw") 9 input_box.send_keys("selenium")