四 Selenium常用API(浏览器操作,鼠标事件,键盘事件,元素等待)

一 浏览器操作

   <1>浏览器窗口大小设置

# 设置浏览器宽480、高800
driver.set_window_size(480,800)
#最大化操作
driver.maximize_window()
#最小化操作
driver.minimize_window()
示例

   <2>浏览器页面前进后退

#后退
driver.back()
#前进
driver.forward()
示例

   <3> 页面刷新

driver.refresh()

   <4> 浏览器关闭

# 关闭当前窗口
driver.close()
#退出驱动并关闭所有关联的窗口
driver.quit()

二 鼠标事件

ActionChains类提供的鼠标事件常用方法(perform()执行所有ActionChains中存储的行为) 

from selenium.webdriver.common.action_chainsimport ActionChains
#双击事件
ActionChains(driver).double_click(element).perform()
#右击事件
ActionChains(driver).context_click(element).perform()
#鼠标悬停
ActionChains(driver).move_to_element(element).perform()
#拖放操作drag_and_drop(source, target)
#source:鼠标拖动的源元素.
#target:鼠标释放的目标元素
ActionChains(driver).drag_and_drop(element,target).perform()
示例

三 键盘事件

使用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)
#键盘F12
send_keys(Keys.F12)
示例

四  元素等待

  显示等待(WebDriverWait)

  在设定时间内,针对某一个元素,默认每隔一段时间检测该元素是否存在,如果超过设定时间检测不到则抛出异常.

  WebDriverWait主要有三个参数:

driver : WebDriver的驱动程序(IE,Firefox,Chrome等).
timeout : 最长超过时间,默认以秒为单位.
poll_frequency : 循环去查询的间隙时间,默认是0.5秒.
WebDriverWait一般与until()或Until_not()方法配合使用

 

元素出现 : until() ;元素消失: until_not():判断元素是否消失,是返回True,否返回False

until(self, 
method,    # 在等待期间,每个一段时间调用这个传入的方法,直到该方法的返回值不为空
message='' # 如果超时,则抛出TimeoutException,将message传入给异常
)
until_not 与until相反,until是当某个元素满足某种条件时(出现、存在等等)继续执行;until_not则是当某个元素不满足某种条件时继续执行,参数含义相同

特别注意:

很多时候大家在使用until或until_not时,会将一个WebElement对象传入给method,如下:

WebDriverWait(driver, 10).until(driver.find_element_by_id('kw'))     # 这是错误的用法  
element1 = WebDriverWait(driver,5,0.5).until(lambda x : x.find_element_by_id('kw')) #正确用法

  

这里的参数一定要是可调用的,这个对象一定要有__call__()方法,否则会抛出异常:

TypeError: 'xxx' object is not callable

在这里,也可以用selenium提供的expected_conditions模块中提供的各种条件,也可用WebElement中的is_displayed(),is_selected(),is_enabled()方法或是自己封装的方法均可。下面我们再看看selenium提供了哪些条件,如图所示:

from selenium.webdriver.support import expected_conditions as EC
#title_is:判断当前页面的title是否完全等于(==)预期字符串,返回布尔值
#与until配合使用
b = WebDriverWait(driver,10,0.5).until(EC.title_is('百度一下,你就知道'))
#单独用,需要传入一个driver
title = EC.title_is('百度一下,你就知道')
print(title(driver))

#titlw_contains : 判断当前页面的title是否包含预期字符串,返回布尔值
b = WebDriverWait(driver,10,0.5).until(EC.title_contains('百度'))

#presence_of_element_located : 判断某个元素是否加载到了dom树里,并不代表该元素一定可见(即判断元素是否存在)若存在则返回该元素.
b = WebDriverWait(driver,10,0.5).until(EC.presence_of_element_located((By.CSS_SELECTOR,"input[name='ie']")))
#persence_of_all_elements_located :判断是否至少有1个元素存在于dom树中.(即判断一组元素是否存在,若存在将该一组元素全部返回).
b = WebDriverWait(driver,5,0.5).until(EC.persence_of_all_element_located((By.XPATH,'//input')))
#visibility_of_element_located : 判断某个元素是否可见,可见代表元素非隐藏,并且元素的宽和高都不等于 0(即判断元素是否可见)
b = WebDriverWait(driver,10,0.5).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"input[name='ie']")),message='元素不可见')

#visibility_of : 判断某个元素是否可见,与visibility_of_element_located的区别是该方法只需传入定位到的element就好了.
b=WebDriverWait(driver,10,0.5).until(EC.visibility_of(driver.find_element_by_id('kw')))
#text_to_be_persent_in_element:判断某个元素中的text是否包含了预期的字符串.若包含则返回True
r = WebDriverWait(driver,5,0.5).until(EC.text_to_be_persent_in_element((By.CSS_selector,"a[name='tj_trnews']"),"新闻"))

#text_to_be_in_element_value :判断某个元素中的value属性是否包含预期的字符串.
r = WebDriverWait(driver,5,0.5).until(EC.text_to_be_persent_in_element_value((BY.ID,'su'),'百度一下'))
#frame_to_be_available_and_switch_to_it:判断frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False.

#invisibility_of_element_located:判断某个元素中是否不存在于dom树或不可见.不可见则返回True.
#element_to_be_clickable:判断某个元素是否可见并且是启动状态.(即判断元素是否可点击)
#alert_is_persent:判断页面上是否存在alert.
示例

 

   隐式等待

  隐式等待是通过一定的时长等待页面所有元素加载完成.如果超出了设置的时长,元素还没有被加载则抛NoSuchElementException异常.

 

#默认单元是秒
driver.implicitly_wait(10)

 

 强制等待(sleep休眠)

sleep()方法默认参数以秒为单位,如果设置时长小于1秒,可以用小数点表示

 

posted on 2020-03-19 23:14  rwwh  阅读(199)  评论(0)    收藏  举报

导航