环境
py3.6 + selenium
安装selenium:pip install selenium
下载chromedriver
下载地址:nmp.taobao.org/mirrors/chromedriver找到对应版本
一. 将chromedriver放到chrome浏览器安装路径
路径如下:
C:\\Users\ZYP\AppData\Local\Google\Chrome\Application\chromedriver.exe
注意上面的 C:\\要添加转义 如果写成C:\Users 会报错
二、chromedriver.exe放在python安装目录下,例如:
C:\Python36 这个目录里面
这时,我们引用的时候是这样的:
driver = webdriver.Chrome()
元素定位
元素定位的一个例子
from selenium import webdriver from selenium.webdriver.common.keys import Keys import time,os try: #第一种方式:放在goole chrom 安装目录 path = "C:\\Users\ZYP\AppData\Local\Google\Chrome\Application\chromedriver.exe" driver = webdriver.Chrome(path) #第二种方式:放在python的安装目录 D:\Python\Python36-32,这样就不用加 chromedriver的路径了 #driver = webdriver.Chrome() #浏览器最大化 driver.maximize_window() #link = "https://www.baidu.com/" link ="http://192.168.1.1/main.html#index_status" driver.get(link) #设置等待时间,有时候页面加载过久,没加载完成,会提示元素不可交互 driver.implicitly_wait(5) #定位 #id = "kw" id = "loginlink" seach_element = driver.find_element_by_id(id).click() #driver.find_element_by_class_name(class) #value = "selenium" id1 = "txtUsr" id2 = "txtPwd" id3 = "btnLogin" user = "admin" password = "admin" seach_element1 = driver.find_element_by_id(id1) seach_element1.send_keys(user) seach_element2 = driver.find_element_by_id(id2) seach_element2.send_keys(password) seach_element3 = driver.find_element_by_id(id3) seach_element3.click() #x_path定位 x_path = "//*[@id=\"col2\"]/div/div[1]/div[2]/label" driver.find_element_by_xpath(x_path).click() #css定位 css = "#apn_setting > a" driver.find_element_by_css_selector(css).click() #回车搜索 #seach_element.send_keys(Keys.RETURN) finally: time.sleep(3) driver.quit()
元素定位的方法
#id driver.find_element_by_id(id) #class driver.find_element_by_class_name(class) #文字链接 driver.find_element_by_link_text("手机") #局部文字链接 driver.find_element_by_partial_link_text("手机手") #x_path driver.find_element_by_xpath(x_path) #css选择器 driver.find_element_by_css_selector(css)
更多定位方式可以点击send_keys()查看,文件名为webelement.py
简单的几个处理方法
seach_element1 = driver.find_element_by_id(id)
seach_element1.send_keys(user)
send_keys(),向定位的位置发送指定文字
send_keys(Keys.RETURN) 发送回车
click() 点击
点击RENTURN可以查看键盘事件
键盘事件需要导入Keys
from selenium.webdriver.common.keys import Keys
NULL = '\ue000' CANCEL = '\ue001' # ^break HELP = '\ue002' BACKSPACE = '\ue003' BACK_SPACE = BACKSPACE TAB = '\ue004' CLEAR = '\ue005' RETURN = '\ue006' ENTER = '\ue007' SHIFT = '\ue008' LEFT_SHIFT = SHIFT CONTROL = '\ue009' LEFT_CONTROL = CONTROL ALT = '\ue00a' LEFT_ALT = ALT PAUSE = '\ue00b' ESCAPE = '\ue00c' SPACE = '\ue00d' PAGE_UP = '\ue00e' PAGE_DOWN = '\ue00f' END = '\ue010' HOME = '\ue011' LEFT = '\ue012' ARROW_LEFT = LEFT UP = '\ue013' ARROW_UP = UP RIGHT = '\ue014' ARROW_RIGHT = RIGHT DOWN = '\ue015' ARROW_DOWN = DOWN INSERT = '\ue016' DELETE = '\ue017' SEMICOLON = '\ue018' EQUALS = '\ue019' NUMPAD0 = '\ue01a' # number pad keys NUMPAD1 = '\ue01b' NUMPAD2 = '\ue01c' NUMPAD3 = '\ue01d' NUMPAD4 = '\ue01e' NUMPAD5 = '\ue01f' NUMPAD6 = '\ue020' NUMPAD7 = '\ue021' NUMPAD8 = '\ue022' NUMPAD9 = '\ue023' MULTIPLY = '\ue024' ADD = '\ue025' SEPARATOR = '\ue026' SUBTRACT = '\ue027' DECIMAL = '\ue028' DIVIDE = '\ue029' F1 = '\ue031' # function keys F2 = '\ue032' F3 = '\ue033' F4 = '\ue034' F5 = '\ue035' F6 = '\ue036' F7 = '\ue037' F8 = '\ue038' F9 = '\ue039' F10 = '\ue03a' F11 = '\ue03b' F12 = '\ue03c' META = '\ue03d' COMMAND = '\ue03d'
from selenium import webdriver
#引入ActionChains类
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Firefox()
driver.maximize_window()
driver.get('https://www.thishop.com/')
time.sleep(3)
#定位到要悬停的元素
stop =driver.find_element_by_class_name("icon-arrow-down")
#对定位到的元素执行鼠标悬停操作
ActionChains(driver).context_click(stop).perform()
键盘事件,在现实操作中我们习惯性的按tab见切换到写一个输入或者元素,Key()类几乎提供所有按键的方法
下面经常使用到的键盘操作:
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
from selenium import webdriver #引入Keys模块
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
#输入框输入内容
driver.find_element_by_id("kw").send_keys("seleniumm")
#删除多输入的一个m
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
#输入空格键+“教程”
driver.find_element_by_id("kw").send_keys(Keys.SPACE)
driver.find_element_by_id("kw").send_keys(u"教程")
#ctrl+a 全选输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
#ctrl+x 剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
#ctrl+v 粘贴内容到输入框
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'v')
#通过回车键盘来代替点击操作
driver.find_element_by_id("su").send_keys(Keys.ENTER)
driver.quit()
鼠标事件
from selenium import webdriver #鼠标悬停需要用到ActionChains from selenium.webdriver.common.action_chains import ActionChains import time try: driver = webdriver.Chrome() driver.maximize_window() link = "http://192.168.1.1/main.html#index_status" driver.get(link) driver.implicitly_wait(5) #定位悬停的元素 elem = driver.find_element_by_link_text("Login") #鼠标悬停事件,能看到页面上有下划线,即是悬停成功了 ActionChains(driver).move_to_element(elem).perform() time.sleep(2) #键盘事件 finally: time.sleep(2) driver.quit()
鼠标事件需要导入ActionChains
from selenium.webdriver.common.action_chains import ActionChains
更多鼠标事件可以点击move_to_element 查看
在自动化测就是模拟人为的操作,上一篇讲的是定位页面元素来找到某个点,当我们找到该元素后可以进行相应的操作
clear() 清除文本
send_keys("输入内容") 想输入框输入内容
click() 点击事件
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('http://www.baidu.com')
driver.find_element_by_id('kw').clear() #清除输入框
driver.find_element_by_id('kw').send_keys('selenium+python') #输入selenium+python
driver.find_element_by_id('su').click() #点击搜索按钮
通过上面的操作可以模拟鼠标的操作如click()不过现实中鼠标还有的操作,比如双击、右键、拖动、悬停等等,在WebDriver 中这些关于鼠标操作的方法由 ActionChains 类提供。
ActionChains类提供的鼠标操作的常用方法:
perform() 执行所有 ActionChains 中存储的行为
context_click() 右击
double_click() 双击
drag_and_drop() 拖动
move_to_element() 鼠标悬停
关于等待时间
selenium中的等待时间有3种:sleep(second);WebDricerWait(driver,timeout,poll_frequency,ignored_exceptions);implicicitly(second)
1.sleep(second) :强制等待,封装在time中的sleep类中
time.sleep(3)
2.WebDricerWait(driver,timeout,poll_frequency,ignored_exceptions) 显式等待,当找到要校验的元素后就继续执行下面的程序,非强制等待
driver:浏览器驱动
timeout:最长超时,秒为单位
poll_frequency:检测间隔(步长)时间,默认为0.5s
ignored_exceptions:超时后的异常信息,默认情况下抛出 NoSuchElementException
webDriverWait 一般与until()与until_not()方法配合使用
#!/usr/bin/env python # _*_ coding:utf-8 _*_ from selenium import webdriver from time import sleep from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC #WebDriverWait 显式等待 driver = webdriver.Firefox() driver.get("https://www.baidu.com/") el = driver.find_element_by_xpath('//*[@id="kw"]') element = WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located((By.ID,"kw"))) element.send_keys("selenium") driver.find_element_by_xpath('//*[@id="su"]').click() sleep(5) driver.quit()
3.implicicitly(second)隐式等待,设置最长等待时长,如果在特定时间内未找到元素则抛出NoSuchElementException异常
driver = webdriver.Chrome() driver.maximize_window() link = "http://192.168.1.1/main.html#index_status" driver.get(link) driver.implicitly_wait(5)
上传文件的方法
1.通过input方式上传文件
seach_element = driver.find_element_by_id("fileField").send_keys(path)
2.通过AutoIt
有的不是通过input上传的,就需要特别处理了,这里我们用autoit 来上传文件
AutoIt的主要功能?
1)模拟键击动作(支持大多数的键盘布局)
2)模拟鼠标移动和点击动作。
3)对窗口进行移动、调整大小和其它操作。
4)直接与窗口的“控件“交互(设置/获取 文字、移动、关闭,等等)
5)配合剪贴板进行剪切/粘贴文本操作
6)对注册表进行操作
下载地址:https://www.autoitscript.com/site/autoit/downloads/
安装完成后可以在开始菜单看到如下显示:
用Autoit定位Windows弹框
1.在页面中定位并点击“选择文件”按钮,显示如下所示弹框,因为是页面外Windows弹框,需要使用AutoIt工具实现。(这里打开上传的地方,弹出window的选择框,这里之前查的资料都是打开自带的autoit工具弹窗,根本用不了)
第二步:写脚本
1)点击“开始”--- 找到“AutoIt V3”工具包 --- 点击“AutoItWindow Info(x64)”工具,版本按本机系统来选择,显示如下:
2)鼠标选中“FinderTool”,拖动到“文件名”输入框中,即可定位该输入框。重复上述步骤定位“打开”按钮。如图显示:
3)使用AutoIt工具包下的“SciTE Script Editor”写脚本,并保存为au3格式。
编译完后,保存,直接按F5运行脚本,
正确上传即表示成功
注意:如果页面报错提示如下:需检查脚本中引号的使用是否正确。特别是第一行和第三行。
还有路径不要加 \\ 而是正常的:D:\utel.zip
ControlFocus("打开","","Edit1")
WinWait("[CLASS:#32770]","",10)
ControlSetText("打开","", "Edit1", "")
Sleep(2000)
ControlClick("打开","","Button1")
代码解释:
第一行:
ControlFocus ( "title", "窗口文本",controlID) 设置输入焦点到指定窗口的某个控件上;
第二行:
WinWait ( "title" , "窗口文本" , 超时时间 ) 暂停脚本的执行直至指定窗口存在(出现) 为止;
第三行:
ControlSetText ( "title", "窗口文本",controlID, "新文本" ) 修改指定控件的文本;
第四行:Sleep 延迟执行
第五行:ControlClick ( "title", "窗口文本",控件ID , 按钮 , 点击次数 ) 向指定控件发送鼠标点击命令;
其中:“title”即AutoIt Window Info识别出的Title字段(上图标红部分), “controlID”即AutoItWindow Info识别出的Class和Instance的拼接,就是ClassnameNN的值。
第三步:编译为可执行文件
使用AutoIT工具包下的Complie Script to .exe工具把刚编写的脚本编译成可执行文件,操作如下:
第四步:调用可执行文件
在python脚本中添加
2)在代码中写入: import os os.system(os.getcwd() + "\\autoit\\import.exe") 或者直接os.system("D:\\upfile.exe")
以上通过第三方软件导入脚本的方法比较麻烦
更简单的方式是
#上传配置,当网页代码是用input的,并且是type = text driver.find_element_by_xpath("//*[@id=\"fileField\"]").send_keys(path_cfg)
满足条件为:当网页代码是用input的,并且是type = text
JS定位
实例
# !/usr/bin/env python # _*_coding:utf-8_*_ from selenium import webdriver import time try: driver = webdriver.Chrome() driver.maximize_window() link = "https://www.12306.cn/index/" driver.get(link) time.sleep(3) driver.implicitly_wait(5) from_element = driver.find_element_by_id("fromStationText") from_element.click() time.sleep(2) from_element.send_keys("北京") #driver.find_elements_by_xpath("//*[test()='北京北']").click()//*[@id="citem_0"] driver.find_element_by_xpath("//*[@id=\"citem_0\"]").click() to_element = driver.find_element_by_id("toStationText") to_element.click() time.sleep(2) to_element.send_keys("长春") driver.find_element_by_xpath("//*[@id=\"citem_1\"]/span[1]").click() #去掉readonly属性 js = "$('input[id=train_date]').removeAttr('readonly')" driver.execute_script(js) #清空内容输入值,测试时无法clear,需要找原因 # date_element = driver.find_element_by_id("train_date").click() # time.sleep(2) # date_element.clear() # time.sleep(5) # date_element.send_keys("2019-05-28") #使用js修改日期 js_value = 'document.getElementById("train_date").value="2019-05-28"' driver.execute_script(js_value) driver.find_element_by_class_name("form-label").click() #直接点击查询按钮 driver.find_element_by_id("search_one").click() finally: time.sleep(2)
改变日期有两种方法:
driver.get("https://kyfw.12306.cn/otn/index/init")
# 去掉元素的readonly属性
js = 'document.getElementById("train_date").removeAttribute("readonly");'
driver.execute_script(js)
# 用js方法输入日期
js_value = 'document.getElementById("train_date").value="2016-12-25"'
driver.execute_script(js_value)
# # 清空文本后输入值
# driver.find_element_by_id("train_date").clear()
# driver.find_element_by_id("train_date").send_keys("2016-12-25")
但是click()一直有问题,后面用了js的方式,并且js方法更方便
Selenium:利用select模块处理下拉框
首先导入Select模块:
1 # coding=utf-8 2 from selenium import webdriver 3 from selenium.webdriver.support.select import Select
Select提供了三种选择
1 select_by_index # 通过索引定位 2 select_by_value # 通过value值定位 3 select_by_visible_text # 通过文本值定位
index索引是从“0”开始;
value是option标签的一个属性值,并不是显示在下拉框中的值;
visible_text是在option标签中间的值,是显示在下拉框的值;
Select提供了三种返回options信息的方法
1 options # 返回select元素所有的options 2 all_selected_options # 返回select元素中所有已选中的选项 3 first_selected_options # 返回select元素中选中的第一个选项
这三种方法的作用是查看已选中的元素是否是自己希望选择的:
options:提供所有选项的元素列表;
all_selected_options:提供所有被选中选项的元素列表;
first_selected_option:提供第一个被选中的选项元素;
Select提供了四种取消选中项的方法
1 deselect_all # 取消全部的已选择项 2 deselect_by_index # 取消已选中的索引项 3 deselect_by_value # 取消已选中的value值 4 deselect_by_visible_text # 取消已选中的文本值
driver.get('http://www.baidu.com') print(driver.title) # 把页面 title 打印出来
将浏览器最大化显示
browser.maximize_window() #将浏览器最大化显示
#"设置浏览器宽480、高800显示" browser.set_window_size(480, 800)
browser.back() 返回
browser.forward() 前进
send_keys("xx") 用于在一个输入框里输入 xx 内容。 click() 用于点击一个按钮。 clear() 用于清除输入框的内容 #通过 submit() 来操作 driver.find_element_by_id("su").submit() text 获取元素文本 data=driver.find_element_by_id("cp").text get_attribute 获得属性值 select = driver.find_element_by_tag_name("select") allOptions = select.find_elements_by_tag_name("option") for option in allOptions: option.get_attribute("value")
ActionChains 类 from selenium.webdriver.common.action_chains import ActionChains qqq =driver.find_element_by_xpath("xxx") #对定位到的元素执行鼠标右键操作 ActionChains(driver).context_click(qqq).perform() #对定位到的元素执行鼠标双击操作 ActionChains(driver).double_click(qqq).perform() #定位元素的原位置 element = driver.find_element_by_name("source") #定位元素要移动到的目标位置 target = driver.find_element_by_name("target") #执行元素的移动操作 ActionChains(driver).drag_and_drop(element, target).perform()
# 选择所有的 checkbox 并全部勾上 checkboxes = dr.find_elements_by_css_selector('input[type=checkbox]') for checkbox in checkboxes: checkbox.click() time.sleep(2) # 把页面上最后1个 checkbox 的勾给去掉 dr.find_elements_by_css_selector('input[type=checkbox]').pop().cl ick()
f1中嵌套f2 #先找到到 ifrome1(id = f1) browser.switch_to_frame("f1") #再找到其下面的 ifrome2(id =f2) browser.switch_to_frame("f2") browser.find_element_by_id("kw").send_keys("selenium") browser.find_element_by_id("su").click()
用法与 switch_to_frame 相同: driver.switch_to_window("windowName")
#先定位到下拉框 m=driver.find_element_by_id("ShippingMethod") #再点击下拉框下的选项 m.find_element_by_xpath("//option[@value='10.69']").click()
当我们在保存百度的设置时会会弹出一个确定按钮;我们并没按照常规的方法去定
位弹窗上的“确定”按钮,而是使用:
driver.switch_to_alert().accept()
text 返回 alert/confirm/prompt 中的文字信息
accept 点击确认按钮
dismiss 点击取消按钮,如果有的话
end_keys 输入值,这个 alert\confirm 没有对话框就不能用了,不然会报错。