莫愁前路无知己,天下谁人不识君。。。。

python+selenium自动化常用的知识点汇集

上一篇 / 下一篇  2017-11-02 11:33:38 / 个人分类:测试技巧

看看总是好的(selenium重要基础知识都在这里)
#tab的定位相相于清除了密码框的默认提示信息,等同上面的clear
driver.find_element_by_id("user_name").send_keys(Keys.TAB)
#通过定位密码框,enter(回车)来代替登陆按钮
driver.find_element_by_id("user_pwd").send_keys(Keys.ENTER)
BACKSPACE(或者BACK_SPACE) ——退格、删除键
TAB ——有时可用来切换input框的焦点
ENTER ——回车键,有时可用来代替点击提交按钮
SHIFT(或LEFT_SHIFT) ——和其他按键同时发送,可发送大写字母或特殊符号
CONTROL(或LEFT_CONTROL) ——和其他按键同时发送可实现一些功能如‘CONTROL+A’、‘CONTROL+C’、‘CONTROL+X’、‘CONTROL+V’等等
ALT(或LEFT_ALT) ——和其他键一起使用
SPACE ——输入空格,或选中checkbox、radio框
PAGE_UP/PAGE_DOWN ——通过按键可上下翻页

Webdriver中比较常用的操作元素的方法:
clear()    清除输入框的默认内容
send_keys("xxx")    在一个输入框里输入xx内容
——如果输入中文,则需要在脚本开头声明编码为utf-8,然后在中文字符前面加u(如:send_keys(u"中文内容"))
click()    点击一个按钮
submit()    提交表单

WebElement接口常用方法:
size    返回元素的尺寸
——如:size = driver.find_element_by_id("id").size
text    获取元素的文本
——如:text = driver.find_element_by_id("id").text
get_attribute(name)    获得属性值
——如:attribute = driver.find_element_by_id("id").get_attribute(‘type‘)
is_displayed()    设置该元素是否用户可见
——如:isshow = driver.find_element_by_id("id").is_displayed()

ActionChains类鼠标操作的常用方法:
引入ActionChains类:from selenium.webdriver.common.action_chains import ActionChains
context_click()    右击
——如:RightClick = driver.find_element_by_id("id")
           ActionChains(driver).context_click(RightClick).perform()
double_click()    双击
——如:DoubleClick = driver.find_element_by_name("name")
           ActionChains(driver).double_click(DoubleClick).perform()
drag_and_drop(source, target)    鼠标拖放
——source:鼠标按下的源元素;target:鼠标释放的目标元素
——如:element = driver.find_element_by_name("name")
           target = driver.find_element_by_name("name")
           ActionChains(driver).drag_and_drop(element, target).perform()
move_to_element()    鼠标悬停在一个元素上(出现下拉列表框)
——如:above = driver.find_element_by_xpath("xpath路径")
           ActionChains(driver).move_to_element(above).perform()
注:当以上命令不好用时:使用js命令
js = 'document.getElementById("importbutton").dispatchEvent(new Event("mouseover"))'
driver.execute_script(js)
click_and_hold()    按下鼠标左键在一个元素上
——如:left = driver.find_element_by_name("name")
           ActionChains(driver).click_and_hold(left).perform(

键盘事件:
引入Keys类包:from selenium.webdriver.common.keys import Keys
send_keys()    输入框输入内容
——如:driver.find_element_by_id("id").send_keys("XXX")
send_keys(Keys.BACK_SPACE)    向左删除一个字符                                              ——如:driver.find_element_by_id("id").send_keys("XXX")
send_keys(Keys.SPACE)    输入空格
——如:driver.find_element_by_id("id").send_keys(Keys.SPACE)
send_keys(Keys.CONTROL,‘a‘)    ctrl+a 全选输入框的内容
——如:driver.find_element_by_id("id").send_keys(Keys.CONTROL,‘a‘)
send_keys(Keys.CONTROL,‘x‘)    ctrl+x 剪切输入框的内容
——如:driver.find_element_by_id("id").send_keys(Keys.CONTROL,‘x‘)
send_keys(Keys.CONTROL,‘v‘)    ctrl+v 粘贴到输入框
——如:driver.find_element_by_id("id").send_keys(Keys.CONTROL,‘v‘)
send_keys(Keys.ENTER)    回车代替点击
——如:driver.find_element_by_id("id").send_keys(Keys.ENTER)
send_keys(Keys.TAB)    制表键(Tab)
——如:driver.find_element_by_id("id").send_keys(Keys.TAB)
send_keys(Keys.ESCAPE)    回退键(Esc)
——如:driver.find_element_by_id("id").send_keys(Keys.ESCAPE) 
send_keys(Keys.CONTROL,‘c‘)    复制
——如:driver.find_element_by_id("id").send_keys(Keys.CONTROL,‘c‘)  

打印信息

#获得title并打印
title = driver.title
print title
#拿当前title名称进行预期比较
if title == u"百度一下,你就知道":
  print "title yes!"
else:
  print "title no!"
#获得当前URL并打印
url = driver.current_url
print url
等待时间

#导入 WebDriverWait 包
from selenium.webdriver.support.ui import WebDriverWait
#导入 time 包
import time
sleep()    设置固定等待时间
——如:time.sleep(5)  #等待5秒
implicitly_wait()    等待一个元素被发现,或一个命令完成,超出了设置时间则抛出异常
——如:driver.implicitly_wait(30)
           driver.find_element_by_id("id").click()
WebDriverWait()    在设置时间内,默认每隔一段时间检测检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
——driver:WebDriver 的驱动程序(Ie, Firefox, Chrome 或远程)
——timeout:最长超时时间,默认以秒为单位
——poll_frequency:休眠时间的间隔(步长)时间,默认为 0.5 秒
——ignored_exceptions:超时后的异常信息,默认情况下抛 NoSuchElementException 异常
——如1:element = WebDriverWait(driver, 10).until(lambda x : x.find_element_by_id("id"))
           element.send_keys("selenium")
——如2:element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id(“Id”))
            is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).until_not(lambda x: x.find_element_by_id(“someId”).is_displayed())
WebDriverWai()一般由 unit()或 until_not()方法配合使用:
——until(method, message=’’)
      调用该方法提供的驱动程序作为一个参数,直到返回值不为 False。
——until_not(method, message=’’)
      调用该方法提供的驱动程序作为一个参数,直到返回值为 False。

定位一组对象

#选择当前页面上所有tag name为input的元素
inputs = driver.find_elements_by_tag_name(‘input‘)
#从中过滤出type为checkbox的元素,并勾选上
for input in inputs:
  if input.get_attribute(‘type‘) == ‘checkbox‘:
    input.click()
#使用CSS定位选择所有type为checkbox的元素,并勾选上
checkboxes = driver.find_elements_by_css_selector(‘input[type=checkbox]‘)
for checkbox in checkboxes:
  checkbox.click()
#把最后一个checkbox的勾去掉    pop()为空则是最后一个

switch_to
selenium做自动化的过程中,经常会遇到alert、frame和新的window,这是经常是switch_to家族大展拳脚的时候,先看看switch_to家族的成员:
alert ——返回浏览器的Alert对象,可对浏览器alert、confirm、prompt框操作
driver.switch_to_alert().accept()  # 点击弹出里面的确定按钮  
#driver.switch_to_alert().dismiss() # 点击弹出上面的X按钮 
#driver.switch_to_alert().send_keys("xxx") # 输入值
#a1 = driver.switch_to.alert  # 通过switch_to.alert切换到alert
#print a1.text
window--window类似于alert,不过与原window是平行的,所以只需要切换到新的window上便可以操作该window的元素
#driver.switch_to.window(window_handle)
driver.current_window_handle 
driver.window_handles
default_content() ——切到主文档

frame(frame_reference) ——切到某个frame
# 先到f1再到f2
driver.switch_to_frame('f1')
driver.switch_to_frame('f2')
# 直接跳出所有frame
driver.switch_to_default_content()
从f2切回到f1,driver.switch_to.parent_frame()  # 如果当前已是主文档,则无效果
parent_frame() ——切到父frame,这个方法也不常被人所知,但有多层frame的时候很有用,不过这里要提一句,一般这种嵌套多层的frame都是有问题的,会影响到性能,可以提给开发,让其改进 

active_element ——返回当前焦点的WebElement对象
switch_to.active_element返回的是当前焦点的对象,即返回WebElement对象。
那么焦点是什么?大概可以这样理解:即网页上当前操作的对象(也就是你网页上光标的位置),比如,你鼠标点击到了一个input框,你可以在这个input框里输入信息,这时这个input框即焦点。

river.find_element_by_class_name('fnew').click()
time.sleep(2)
driver.switch_to.active_element.send_keys('filename')
time.sleep(2)

而下面两种都失败:
l = driver.find_element_by_id('pm_treeRoom_1_span')
ActionChains(driver).context_click(l).perform()
driver.find_element_by_class_name('fnew').click()
time.sleep(2)
driver.find_element_by_xpath('//*[@id="pm_treeRoom_1_ul"]/li[...]').send_keys('filename')
time.sleep(2)
或:
driver.find_element_by_class_name('fnew').click()
time.sleep(2)
ActionChains(driver).send_keys('filename')
time.sleep(2)

文本框获得焦点:
使用原生js必须
document.getElementById("kw").onfocus()
jquery中可以直接
$("#kw").focus();获得焦点
jQuery 是对原生 JS 的一层封装。
$("#id").focus(function()
{
});
等同于原生 JS 的:
document.getElementById("id").onfocus = function(){
};
$("#id").focus();
等同于:
document.getElementById("id").focus();



TAG: Python Selenium

 

评分:0

我来说两句

Open Toolbar