记录学习内容
学习命令顺序:文章Selenium Python 教程
目录
元素定位
find_element_by_id()
find_element_by_name()
find_element_by_class_name()
find_element_by_tag_name()
find_element_by_link_text()
find_element_by_partial_link_text()
find_element_by_xpath()
find_element_by_css_selector()
这些属于老代码使用的,目前新版本使用方式为:
#注意一定要import By!!!不然用不了这个
from selenium.webdriver.common.by import By
find_element(By.ID, "loginName")
find_element(By.NAME, "SubjectName")
find_element(By.CLASS_NAME, "u-btn-levred")
find_element(By.TAG_NAME, "input")
find_element(By.LINK_TEXT, "退出")
find_element(By.PARTIAL_LINK_TEXT, "退")
find_element(By.XPATH, "//*[@id='Title']")
find_element(By.CSS_SELECTOR, "[type=submit]")
新版Selenium不适用老版代码的解决方法:
python+Selenium——解决find_element_by_*方法被弃用,appium调用webdriver模块库会直接报错
控制浏览器操作
-
控制浏览器窗口大小(第一个数为宽,第二个数为高)
driver.set_window_size(300, 600) -
浏览器后退,前进,刷新,关闭
后退:driver.back()
前进:driver.forward()
刷新:driver.refresh()
关闭当前页:driver.close()
关闭所有页:driver.quit() -
获取页面信息——注意没有括号
获取当前页面url:driver.current_url
获取当前标题 :driver.title
获取当前浏览器名称:driver.name
获取当前页面源代码:driver.page_source
"""
控制浏览器
"""
#窗口大小,第一个数是宽,第二个数是高
driver.set_window_size(800, 1200)
#后退
driver.back()
#回到刚才回退的那个页面
driver.forward()
#刷新页面
driver.refresh()
#关闭当前页
driver.close()
#关闭所有页
driver.quit()
#获取页面信息——注意没有括号
#获取当前页面url
print(driver.current_url)
#获取当前标题
print(driver.title)
#获取当前浏览器名称
print(driver.name)
#获取当前页面源代码
print(driver.page_source)
Webelement常用方法
-
点击和输入
清除文本 :driver.find_element(By.ID, ‘kw’).clear()
模拟按键输入 :driver.find_element(By.ID, ‘kw’).send_keys(“selenium”)
单机元素:driver.find_element(By.ID, ‘su’).click() -
提交
可以在搜索框模拟回车操作
search_text = driver.find_element(By.ID, ‘kw’)
search_text.send_keys(‘selenium’)
search_text.submit()
"""
webElement操作
"""
#点击和输入
driver.find_element(By.ID, 'kw')
driver.find_element(By.ID, 'kw').send_keys("selenium")
driver.find_element(By.ID, 'su').click()
driver.find_element(By.ID, 'kw').clear()
#提交
search_text = driver.find_element(By.ID, 'kw')
search_text.send_keys("selenium")
search_text.submit()
键盘鼠标操作
参考:Selenium快速入门之2:ActionChains所有行为动作、常用JS操作
在 WebDriver 中, 将这些关于鼠标操作的方法封装在 ActionChains 类提供。
ActionChains 类提供了鼠标操作的常用方法:
常用键盘按键
from selenium.webdriver.common.keys import Keys
#删除键(BackSpace)
send_keys(Keys.BACK_SPACE)
#空格键(Space)
send_keys(Keys.SPACE)
#制表键(Tab)
send_keys(Keys.TAB)
#回退键(Esc)
send_keys(Keys.ESCAPE)
#回车键(Enter)
send_keys(Keys.ENTER)
#全选(Ctrl+A)
send_keys(Keys.CONTROL,'a')
#复制(Ctrl+C)
send_keys(Keys.CONTROL,'c')
#剪切(Ctrl+X)
send_keys(Keys.CONTROL,'x')
#粘贴(Ctrl+V)
send_keys(Keys.CONTROL,'v')
#键盘 F1
send_keys(Keys.F1)
等待页面加载完成
显式等待
显式等待使WebdDriver等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常(TimeoutException)。
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 5, 0.5).until(
EC.presence_of_element_located((By.ID, "kw"))
)
element.send_keys('selenium')
WebDriverWait类是由WebDirver 提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。具体格式如下:
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
driver :浏览器驱动。
timeout :最长超时时间,默认以秒为单位。
poll_frequency :检测的间隔(步长)时间,默认为0.5S。
ignored_exceptions :超时后的异常信息,默认情况下抛NoSuchElementException异常。
WebDriverWait()一般由until()或until_not()方法配合使用,下面是until()和until_not()方法的说明:
until(method, message=‘’): 调用该方法提供的驱动程序作为一个参数,直到返回值为True。
until_not(method, message=‘’) :调用该方法提供的驱动程序作为一个参数,直到返回值为False。
在本例中,通过as关键字将expected_conditions 重命名为EC,并调用presence_of_element_located()方法判断元素是否存在。
隐式等待
如果某些元素不是立即可用的,隐式等待是告诉WebDriver去等待一定的时间后去查找元素。 默认等待时间是0秒,一旦设置该值,隐式等待是设置该WebDriver的实例的生命周期。
当使用了隐式等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常。换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是0
driver.implicitly_wait(20)
在不同的窗口和框架之间移动
driver.switch_to_window(“windowName”)
driver.switch_to_frame(“frameName”)
以直接取表单的id 或name属性。如果iframe没有可用的id和name属性,则可以通过下面的方式进行定位。
#先通过xpth定位到iframe
xf = driver.find_element_by_xpath('//*[@id="x-URS-iframe"]')
#再将定位对象传给switch_to_frame()方法
driver.switch_to_frame(xf)
一旦我们完成了frame中的工作,我们可以这样返回父frame:
driver.switch_to_default_content()
注:窗口是指同一个浏览器上方不同的窗口,当测试页面同时出现2个或者以上窗口时候,而且新打开的window没有或不清楚namem,可以使用driver.switch_to_window(handle)来进行切换
handles = driver.window_handles #获取当前浏览器的所有窗口句柄
driver.switch_to.window(handles[-1]) #切换到最新打开的窗口
driver.switch_to.window(handles[-2]) #切换到倒数第二个打开的窗口
driver.switch_to.window(handles[0]) #切换到最开始打开的窗口
警告框
#alert = driver.switch_to_alert()
#目前已经改版为
driver.switch_to.alert
- 警告类弹alert(),显示警告或其他信息,用于通知用户,下方只有一个【确认】按钮。
- 确认类弹窗confirm(),询问是否继续某种操作等功能,下方有【确认】和【取消】两种按钮。
- 消息类弹窗prompt(),需要输入一些信息,比如用户密码等,下方会有【确认】和【取消】按扭
然后使用 text/accept/dismiss/send_keys 按需进行操作
- text:返回 alert/confirm/prompt 中的文字信息。
- accept():接受现有警告框。
- dismiss():解散现有警告框。
- send_keys(keysToSend):发送文本至警告框。keysToSend:将文本发送至警告框。
driver.get("file:///D:/nginx/nginx-1.12.2/html/jsapi-dev/test.html")
driver.find_element(By.XPATH, '/html/body/input').click()
#接受弹窗
driver.switch_to.alert.accept()
#得到弹窗的文本消息,比如得到:请输入用户名!
message = driver.switch_to.alert.text
print(message)
#取消按钮
driver.switch_to.alert.dismiss()
#输入值
driver.switch_to.alert.send_keys("selenium")
driver.switch_to.alert.accept()
html文件是我自己写的,用vsCode运行即可,代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>js-test</title>
<style>
.myBtn {
font-size: 16px;
background-color: #0094ff;
border: 0;
text-align: center;
padding: 0 10px;
margin: 5px;
min-width: 80px;
}
</style>
<script type="text/javascript">
function display_alert(){
var name = prompt("I am a prompt box!!");
if(prompt){
document.write(name);
}else{
document.write("NULL");
}
}
</script>
</head>
<body>
<input type="button" onclick="display_alert()" value="Display alert box" />
</body>
</html>
下拉框选择
from selenium.webdriver.support.select import Select
driver.get("file:///D:/nginx/nginx-1.12.2/html/jsapi-dev/test.html")
sel = driver.find_element(By.XPATH, "/html/body/select")
driver.implicitly_wait(10)
#以index属性值来查找匹配的元素并选择
Select(sel).select_by_index(1)
time.sleep(2)
#以value属性值来查找该option并选择
Select(sel).select_by_value('03')
time.sleep(2)
#以text文本值来查找匹配的元素并选择
Select(sel).select_by_visible_text("了却君王天下事,赢得生前身后名。")
time.sleep(2)
#选择第一个option 选项
Select(sel).first_selected_option()
注意,index是从0开始的,不是1
HTML文件:
<body>
<select name="辛弃疾" id="">
<option value="01">破阵子·为陈同甫赋壮词以寄之</option>
<option value="02">醉里挑灯看剑,梦回吹角连营。</option>
<option value="03">八百里分麾下炙,五十弦翻塞外声。沙场秋点兵。</option>
<option value="04">马作的卢飞快,弓如霹雳弦惊。</option>
<option value="05">了却君王天下事,赢得生前身后名。</option>
<option value="06">可怜白发生!</option>
</select>
</body>
文件上传
其实就是找到相关按钮,把文件路径输入到里面
#定位元素按钮,上传文件
driver.find_element(By.name, "file").send_keys('D://upload_file.txt')
操作cookie
参考:Python Selenium.WebDriver 对Cookies的处理及应用『模拟登录』
#获得所有cookie信息
get_cookies()
#返回字典的key为“name”的cookie信息
get_cookie(name)
#添加cookie。“cookie_dict”指字典对象,必须有name 和value 值
add_cookie(cookie_dict)
#删除cookie信息。“name”是要删除的cookie的名称;“optionsString”是该cookie的选项,目前支持的选项包括“路径”,“域”,可不写
delete_cookie(name,optionsString)
#删除所有cookie信息
delete_all_cookies()
#参考demo
"""
cookie
"""
#获得所有cookie信息
cookie = driver.get_cookies()
#返回字典的key为“name”的cookie信息
cookie = driver.get_cookie('ZFY')
print(cookie)
#添加cookie。“cookie_dict”指字典对象,必须有name 和value 值
cookie_dict = {
"name": "Shay_cookie",
"value": "This is a cookie"
}
driver.add_cookie(cookie_dict)
cookie = driver.get_cookie('Shay_cookie')
print(cookie)
#删除cookie信息。“name”是要删除的cookie的名称,“optionsString”是该cookie的选项,目前支持的选项包括“路径”,“域”
driver.delete_cookie('Shay_cookie')
cookie = driver.get_cookie('Shay_cookie')
print(cookie)
#删除所有cookie信息
driver.delete_all_cookies()
调用JavaScript代码
有些操作不能依靠WebDriver提供的API来实现,所以需要调用Javascript代码
参考文章:Selenium实战(二)——调用JavaScript之execute_script()方法
driver.execute_script(js)
- 浏览器滚动条的拖动
window.scrollTo()方法用于设置浏览器窗口滚动条的水平位置和垂直位置,第一个参数表示水平左边距,第二个参数表示垂直上边距。
js = "window.scrollTo(100,450);"
driver.execute_script(js)
- 处理HTML5视频播放
IE9+、Firefox、Opera、Chrome都支持HTML5定义的新元素,下面例子简单自动播放了一段<video>视频:
driver.get("http://videojs.com")
driver.implicitly_wait(10)
video = driver.find_element(By.ID, "preview-player_html5_api")
# 返回播放文件地址
url = driver.execute_script("return arguments[0].currentSrc;", video)
print(url)
窗口截图
#截取当前窗口,并指定截图图片的保存位置
driver.get_screenshot_as_file("D:\\baidu_img.jpg")