WebDriver API
一,元素定位
(1)id定位
find_element_by_id()
(2)name ind_elemfind_element_by_name()
(3)tage定位
find_element_by_tage_name()
(4)class定位
find_element_by_class_name()
(5)link_text
find_element_by_link_text()
(6)partial link定位
find_element_by_partial_link_text()
(7)Xpath定位
find_element_by_xpath()
绝对路径定位:
find_element_by_xpath("/html/body/div[1]/div[1]/div[1]/div")
元素属性定位:
find_element_by_xpath("//*[@id='toolbar-search-input']")
层级与属性结合:
find_element_by_xpath("//span[@class='bg s_ipt_wr']/input")
使用逻辑运算符:
find_element_by_xpath("//input[@id='kw' and @class='s_ipt']")
使用contains方法:
find_element_by_xpath("//span[contains(@class,'s_ipt_wr')]/input")
text()方法:
find_element_by_xpath("//a[text(),'新闻']")
(8)CSS_selector定位
find_element_by_css_selector()
常用方法:
#刷新当前页面
driver.refresh()
#清除文本
clear()
#模拟按键输入
send_Keys(value)
#单击元素
click()
#提交表单
submit()
鼠标操作:
#执行ActionChains类中存储的所有行为
perform()
#右击
context_click()
#双击
double_click()
#拖动
drag_and_drop()
#鼠标悬停
move_to_element()
键盘操作:
#删除键
send_Keys(Keys.BACK_SPACE)
#空格
send_Keys(Keys.SPACE)
#制表
send_Keys(Keys.TAB)
#回退
send_Keys(Keys.ESCAPE)
#回车
send_Keys(Keys.ENTER)
send_Keys(Keys.CONTROL,'a')
send_Keys(Keys.CONTROL,'x')
send_Keys(Keys.CONTROL,'v')
send_Keys(Keys.CONTROL,'F1')
获取验证信息:
title:用于获取当前页面标题
current_url:用于获取当前页面URL
text:用于获取当前页面文本信息
###########################################################
# print("Before Search=============================")
# 获取浏览器名称
# title=driver.title
# print("title:"+title)
# 获取当前页面url
# now_url=driver.current_url
# print("url:"+now_url)
# driver.find_element_by_id("kw").send_keys("selenium")
# driver.find_element_by_id("su").click()
# print("After Search===============================")
# title = driver.title
# print("title:"+title)
# now_url=driver.current_url
# print("url:"+now_url)
# driver.quit()
#############################################################
显示等待:
等摸个条件成立则继续执行(每隔一段时间检查当前页面元素是否存在),否则达到最大时长抛出超时异常
WebDriverWait()常与until(),until_not()配合使用
#WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
driver 浏览器驱动
timeout 最长超时时间默认秒
ignored_exceptions 超时后的异常信息,默认抛出NoSuchElementException异常
#########################################################################
#for i in range(10):
# try:
# dem = driver.find_element_by_id("kwwwwww")
# if dem.is_displayed():
# break
# except:
# pass
# sleep(5)
# else:
# print("超时异常")
# print(ctime())
# driver.quit()
expected_conditions类提供预期条件判断方法
#########################################################################
title_is 获取当前页面标题是否等于预期结果
title_contains 获取当前页面标题是否包含预期字符串
presence_of_element_located 判断元素是否被加在DOM树中
visibility_of_element_located 判断元素是否可见(可见代表不隐藏)
visibility_of 与上述相同上一个方法是定位,该方法接收的参为定位后的元素
presence_of_all_elements_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
invisibility_of_element_located 判断元素是否不在在DOM树中
element_to_be_clickable 判断元素是否可见&&可以点击
staleness_of 等到元素在DOM树中移除
element_selection_state_to_be 判断元素的选中状态是否符合预期
element__to_be_selected 判断元素是否被选中一般用于下拉列表
element_located_selection_state_to_be 同上,但该方法接受的参数为定位
alert_is_present 判断页面上是否存在alert
隐式等待:
driver.implicitly_wait()
implicitly_wait()的参数是时间,单位为秒
隐式等待并不影响脚本执行速度,它会等待页面上的所有元素当脚本执行到某个元素定位时,如果元素存在则继续执行,如果不存在则会轮询超出时间抛出异常。
#################################################################
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
sleep(2)
try:
print(ctime())
driver.find_element_by_id("kww22").send_keys('selenium')
except NoSuchFrameException as e:
print(e)
finally:
print(ctime())
driver.quit()
#################################################################
定位一组元素:
定位一组元素与定位一个元素类似。
#################################################################
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
texts = driver.find_elements_by_xpath("//div[@tpl='se_com_default']/h3/a")
print(len(texts))
for t in texts:
print(t.text)
##################################################################
多表单页面切换:
switch_to.frame()
对于frame表单嵌套情况,只能在一个页面上进行识别,无法定位标签内页面的元素
###################################################################
# login_frame =123456
# driver.find_element_by_class_name('iframe[id^="X-URS-iframe"]')
# driver.switch_to(login_frame)
# driver.find_element_by_name("email").send_keys("username")
# driver.find_element_by_name("password").send_keys("password")
# driver.find_element_by_id("dologin").click()
#回到最外层界面
# driver.switch_to.default_content()
# sleep(10)
# driver.quit()
####################################################################
多窗口切换:
driver.current_url() 获得当前窗口句柄
driver.window_handles() 返回所有窗口的句柄到当前会话
driver.switch_to.window() 切换到相应的窗口
driver.switch_to.window(search_windows)
print(driver.title)
警告框处理:
通过switch_to.alert()方法,处理js生成的alert,confirm,prompt
text 返回alert,confirm,prompt中的文字信息
accept() 接受现有警告框
dismiss() 解散现有警告框
send_keys() 在警告框中输入文本
下拉框处理:
Select类 用于定位<select>标签
select_by_value(): 通过value值定位下拉选项
select_by_visible_text(): 通过text值定位下拉选项
select_by_index(): 根据下拉选项的索引进行选择,第一个选项为0,第二个选项为1
上传文件:
普通上传:将本地文件路径作为一个值放到input标签里,通过form表单将这个值提交给服务器
插件上传:基于flash,js,Ajax实现上传功能
通过input标签实现的上传功能,将其看做成一个输入框再通过send.keys()指定文件路径实现上传
import os
from selenium import webdriver
filepath = os.path.abspath('./Untitled-1.html')
print(filepath)
driver = webdriver.Chrome()
driver.get(filepath)
driver.find_element_by_id("name").send_keys(filepath+'test.txt')
操作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
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
cookie = driver.get_cookies()
print(cookie)
driver.add_cookie({'name':'keyy','value':'valuee'})
for cookie in driver.get_cookies():
print("%s -> %s" %(cookie['name'],cookie['value']))
ZFY -> RsHeXgY7um0BB3DPPSm1stzWrFxnalwF:AsNJq9Fg1Iw:C
BAIDUID_BFESS -> DAAC0FC7A871F67BF320E0670CFD7559:FG=1
BA_HECTOR -> a8240g80808421cg81ah3ddm1hm69eo1a
keyy -> valuee
H_PS_PSSID -> 36545_37584_36884_34813_37626_36802_36789_37537_37670_26350_37344_37451
BAIDUID -> DAAC0FC7A871F67BF320E0670CFD7559:FG=1
BIDUPSID -> DAAC0FC7A871F67BDE2CFCC9BFB57531
PSTM -> 1667442133
BD_UPN -> 12314753
BD_HOME -> 1
调用JS:
有的页面的操作无法通过webdriver api实现,这时需要借助js实现如浏览器滚动条,文本框输入信息也无法通过send.keys()实现。execute_script()来执行js代码
text = "input text"
js = "document.getElementById('id').value='"+text + "';"
driver.execute_script(js)