from selenium import webdriver
from selenium.webdriver.common.by import By
driver=webdriver.Chrome()
driver.get(‘https://www.baidu.com/’)
driver.find_element(By.ID,‘kw’).send_keys(‘test’)
元素定位
driver.find_element(By.ID,‘id’)
driver.find_element(By.NAME,‘name’)
driver.find_element(By.CLASS_NAME,‘class_name’)
driver.find_element(By.TAG_NAME,‘tag_name’)
driver.find_element(By.LINK_TEXT,‘link_text’)
driver.find_element(By.PARTIAL_LINK_TEXT,‘partial_link_text’)
driver.find_element(By.CSS_SELECTOR,‘css_selector’)
driver.find_element(By.XPATH,‘xpath’)
定位一组元素:定位一组元素的方法与定位单个元素的方法非常像,唯一的区别是单词“element”后面多了一个“s”,用来表示复数。
driver.find_elements(By.ID,‘id’)
driver.find_elements(By.NAME,‘name’)
…
控制浏览器
driver.set_window_size(480,800)#设置浏览器宽480,高800显示
driver.maximize_window()#设置浏览器全屏
driver.back()#浏览器后退
driver.forward()#浏览器前进
driver.refresh()#F5刷新
WebDriver常用方法:
clear()清除文本
send_keys(value)模拟输入
click()点击
submit()提交表单,例如有些搜索框不提供搜索按钮,而是通过键盘上的回车键完成搜索内容的提交,这是可以通过submit()模拟
size返回元素大小
text返回元素文本
get_attribute(name)获得属性值
is_displayed()用于返回一个元素是否可见,如果可见,返回True,不可见返回False
鼠标操作
from selenium.webdriver import ActionChains
在WebDriver中,与鼠标操作相关的方法都封装在ActionChains类中
perform()执行ActionChains类中存储的所有行为
context_click()右击
double_click()双击
drag_and_drop()拖动
move_to_eldment()鼠标悬停
click_and_hold(): 单击并按下鼠标左键,在鼠标事件中介绍过。
move_by_offset():移动鼠标,第一个参数为 x 坐标距离,第二个参数为 y 坐标距离。
reset_actions():重置 action。
#百度中的“设置”悬停菜单
above=driver.find_element(By.XPATH,‘//*[@id=“s-usersetting-top”]’)#定位到要悬停的元素
action=ActionChains(driver)
action.move_to_element(above).perform()
滑动选择年、月、日
driver = webdriver.Chrome()
driver.get(“http://www.jq22.com/yanshi4976”)
driver.implicitly_wait(10)
driver.switch_to.frame(“iframe”)
driver.find_element(By.ID,“appDate”).click()
time.sleep(1)
定位要滑动的年、月、日
dwwos = driver.find_elements(By.CLASS_NAME,“dwwo”)
year = dwwos[0]
month = dwwos[1]
day = dwwos[2]
action = ActionChains(driver)
action.click_and_hold(year).perform()
action.move_to_element_with_offset(year,0,-36).perform()#使用相对坐标向上滑一格
time.sleep(0.5)
action.reset_actions()
action.click_and_hold(month).perform()
action.move_to_element_with_offset(month,0,-36).perform()#使用相对坐标向上滑一格
time.sleep(0.5)
action.reset_actions()
action.click_and_hold(day).perform()
action.move_to_element_with_offset(day,0,-36).perform()#使用相对坐标向上滑一格
time.sleep(0.5)
action.reset_actions()
键盘操作
from selenium.webdriver.common.keys import Keys
以下为常用的键盘操作。
send_keys(Keys.BACK_SPACE):删除键(BackSpace)
send_keys(Keys.SPACE):空格键(Space)
send_keys(Keys.TAB):制表键(Tab)
send_keys(Keys.ESCAPE):回退键(Esc)
send_keys(Keys.ENTER):回车键(Enter)
send_keys(Keys.CONTROL,‘a’):全选(Ctrl+a)
send_keys(Keys.CONTROL,‘c’):复制(Ctrl+c)
send_keys(Keys.CONTROL,‘x’):剪切(Ctrl+x)
send_keys(Keys.CONTROL,‘v’):粘贴(Ctrl+v)
send_keys(Keys.F1):键盘 F1
……
send_keys(Keys.F12):键盘 F12
示例
driver.find_element(By.ID,‘kw’).send_keys(Keys.CONTROL,‘a’)
获得页面信息
title:用于获取当前页面的标题。
current_url:用于获取当前页面的 URL。
text:用于获取当前页面的文本信息。
示例
print(driver.title)
print(driver.current_url)
设置元素等待:显式等待、隐式等待
显式等待是 WebDriver 等待某个条件成立则继续执行,否则在达到最大时长时抛出超时异常(TimeoutException)。
示例:设置5秒类,0.5秒检测一次元素是否可见,超时则抛出异常;expected_conditions 类提供的预期条件判断方法详情见书61页或百度
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 5, 0.5).until(EC.visibility_of_element_located((By.ID, “kw”)))
element.send_keys(‘selenium’)
隐式等待:它会等待页面上的所有元素。当脚本执行到某个元素定位时,如果元素存在,则继续执行;如果定位不到元素,则它将以轮询的方式不断地判断元素是否存在。
假设在第 6s 定位到了元素,则继续执行,若直到超出设置时间(10s)还没有定位到元素,则抛出异常。
from selenium.common.exceptions import NoSuchElementException
设置隐式等待为 10s
driver.implicitly_wait(10)
frame/iframe 表单切换
login_frame = driver.find_element_by_css_selector(‘iframe[id^=“x-URS-iframe”]’)
driver.switch_to.frame(login_frame) #切换到iframe
driver.switch_to.default_content() #回到最外层的页面
多窗口切换
current_window_handle:获得当前窗口句柄。
window_handles:返回所有窗口的句柄。
switch_to.window():切换到相应的窗口。
示例
driver.get(‘https://www.baidu.com/’)
handle1=driver.current_window_handle#获取当前句柄:百度搜索
driver.find_element(By.XPATH,‘//[@id=“s-top-loginbtn”]‘).click()
driver.find_element(By.XPATH,’//[@id=“TANGRAM__PSP_11__regLink”]’).click()
time.sleep(2)
handles=driver.window_handles#获取所有句柄
time.sleep(2)
driver.switch_to.window(handle1)#切到百度搜索页
time.sleep(2)
driver.switch_to.window(handles[1])#切到注册页,一共开了2个句柄,第二个是注册页
警告框处理:首先使用 switch_to.alert方法定位,然后使用 text、accept、dismiss、send_keys 等进行操作。
text:返回 alert、confirm、prompt 中的文字信息。
accept():接受现有警告框。
dismiss():解散现有警告框。
send_keys():在警告框中输入文本(如果可以输入的话)。
eg:
driver=webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get(‘https://www.baidu.com/’)
driver.find_element(By.XPATH,‘//[@id=“s-usersetting-top”]‘).click() #点击设置
driver.find_element(By.LINK_TEXT,‘搜索设置’).click() #点击搜索设置
driver.find_element(By.XPATH,’//[@id=“se-setting-7”]/a[2]’).click() #点击保存设置
#获取警告框
alert=driver.switch_to.alert
#获取警告框文本信息
print(alert.text)
#接受警告框
alert.accept()
下拉框处理
Select 类:用于定位标签。注意:只能用于标签
select_by_value():通过 value 值定位下拉选项。
select_by_visible_text():通过 text 值定位下拉选项。
select_by_index():根据下拉选项的索引进行选择。第一个选项为 0,第二个选项为 1。
from selenium.webdriver.support.select import Select
eg:
#定位下拉框
sel=driver.find_element(By.XPATH,‘//*[@id=“adv-setting-gpc”]/div/div[2]/div[2]’)
Select(sel).select_by_index(1)
Select(sel).select_by_visible_text(‘最近一年’)
上传文件
普通上传:将本地文件路径作为一个值放在 input 标签中,通过 form 表单将这个值提交给服务器。通过 input 标签实现的上传功能,可以将其看作一个输入框,即通过 send_keys()指定本地文件路径的方式实现文件上传
插件上传:一般是指基于 Flash、JavaScript 或 Ajax 等技术实现的上传功能。
操作Cookie
WebDriver 操作 Cookie 的方法如下。
get_cookies():获得所有 Cookie。
get_cookie(name):返回字典中 key 为“name”的 Cookie。
add_cookie(cookie_dict):添加 Cookie。
delete_cookie(name,optionsString):删除名为 OpenString 的 Cookie。
delete_all_cookies():删除所有 Cookie。
eg:
driver.get(‘https://www.baidu.com/’)
cookie=driver.get_cookies()
print(cookie)
调用 JavaScript
WebDriver 提供了 execute_script()方法来执行 JavaScript 代码
例如:window.scrollTo()方法用于设置浏览器窗口滚动条的水平位置和垂直位置。第一个参数表示水平的左边距,第二个参数表示垂直的上边距,代码如下。
driver=webdriver.Chrome()
driver.set_window_size(800,600)
driver.implicitly_wait(10)
driver.get(‘https://www.baidu.com/’)
通过 JavaScript 设置浏览器窗口的滚动条位置
js = “window.scrollTo(100,450);”
driver.execute_script(js)
可以通过 id 定位到元素,但是不能通过 send_keys()在文本框中输入文本信息。在这种情况下,可以借助 JavaScript 代码输入文本信息。
text = “input text”
js = “document.getElementById(‘id’).value='” + text + “';”
driver.execute_script(js)
首先,定义要输入的内容 text。然后,将 text 与 JavaScript 代码通过“+”进行拼接,这样做的目的是为了方便自定义输入内容。最后,通过 execute_script()执行 JavaScript 代码。
处理 HTML5 视频播放
WebDriver 支持在指定的浏览器上测试 HTML5,另外,还可以使用 JavaScript 测试这些功能,这样就可以在任意浏览器上测试 HTML5 了。
大多数浏览器使用插件(如 Flash)播放视频,但是,不同的浏览器需要使用不同的插件。HTML5 定义了一个新的元素,指定了一个标准的方式嵌入电影片段。IE9+、Firefox、Opera、Chrome 都支持元素。
下面介绍如何自动化测试,提供了 JavaScript 接口和多种方法及属性。
JavaScript 有个内置的对象叫作 arguments。arguments 包含了函数调用的参数数组,[0]表示取对象的第 1 个值。
currentSrc 返回当前音频/视频的 URL。如果未设置音频/视频,则返回空字符串。
load()、play()和 pause() 控制视频的加载、播放和暂停。
driver = webdriver.Chrome()
driver.get(“http://videojs.com/”)
video = driver.find_element_by_id(“preview-player_html5_api”)
#返回播放文件地址
url = driver.execute_script(“return arguments[0].currentSrc;”, video)
print(url)
#播放视频
print(“start”)
driver.execute_script(“arguments[0].play()”, video)
#播放 15s
sleep(15)
#暂停视频
print(“stop”)
driver.execute_script(“arguments[0].pause()”, video)
截取当前窗口,指定截图图片的保存位置,截取的是浏览器窗口的图片
driver.save_screenshot(“./test.png”)
关闭窗口
driver.quit()#关闭所有窗口
driver.close()#关闭当前窗口