python+selenium

环境

py3.6 + selenium

安装selenium:pip install selenium

下载chromedriver

下载地址:nmp.taobao.org/mirrors/chromedriver找到对应版本

一. 将chromedriver放到chrome浏览器安装路径

路径如下:

C:\UsersYPAppDataLocalGoogleChromeApplicationchromedriver.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:\UsersYPAppDataLocalGoogleChromeApplicationchromedriver.exe"
    driver = webdriver.Chrome(path)
    #第二种方式:放在python的安装目录 D:PythonPython36-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()
View Code

元素定位的方法

#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'
View Code

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()
View Code

鼠标事件需要导入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)
View Code

改变日期有两种方法:


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 # 取消已选中的文本值
# coding=utf-8
from selenium import webdriver
from selenium.webdriver.support.select import Select
from time import sleep

# 登录
driver = webdriver.Chrome()
......

# 根据索引选择
Select(driver.find_element_by_name("storeDeclare.cityLine")).select_by_index("3")
# 根据value值选择
Select(driver.find_element_by_name("storeDeclare.cityLine")).select_by_value("3线")
# 根据文本值选择
Select(driver.find_element_by_name("storeDeclare.cityLine")).select_by_visible_text("3线")
sleep(5)
driver.quit()
打印 tile
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()
多层框架/窗口定位
本节知识点:
多层框架或窗口的定位:
switch_to_frame()
switch_to_window()
对于一个现代的 web 应用,经常会出现框架(frame) 或窗口(window)的应用,
这也就给我们的定位带来了一个难题。
有时候我们定位一个元素,定位器没有问题,但一直定位不了,这时候就要检查这
个元素是否在一个 frame 中,seelnium webdriver 提供了一个 switch_to_frame 方
法,可以很轻松的来解决这个问题。
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")
下拉框处理
处理下拉框
   switch_to_alert()
   accept()
#先定位到下拉框
m=driver.find_element_by_id("ShippingMethod")
#再点击下拉框下的选项
m.find_element_by_xpath("//option[@value='10.69']").click()
当我们在保存百度的设置时会会弹出一个确定按钮;我们并没按照常规的方法去定
位弹窗上的“确定”按钮,而是使用:
driver.switch_to_alert().accept()
alert、confirm、prompt 的处理
text 返回 alert/confirm/prompt 中的文字信息
accept 点击确认按钮
dismiss 点击取消按钮,如果有的话
end_keys 输入值,这个 alertconfirm 没有对话框就不能用了,不然会报错。
原文地址:https://www.cnblogs.com/Aline2/p/10584806.html