2023年11月25日发(作者:)
【selenim3+Python】界⾯⾃动化测试教程
⼀、打开浏览器
selenium3⽀持基本上⽬前市⾯上最常见的⼏种浏览器,本⽂只写其中的chrome、firefox和ie的相关操作;
1、chrome浏览器
(1)、chromeDriver获取
(2)、启动chrome
基本启动⽅式代码如下:
import unittest
from selenium import webdriver
class Test(unittest.TestCase):
def testName(self):
driver = webdriver.Chrome("D:")
driver.get("")
if __name__ == "__main__":
unittest.main()
当然chrome启动还可以加其他参数,譬如启动参数、添加扩展、添加代理等;
代码如下所⽰:
options = webdriver.ChromeOptions
'''1、添加启动参数'''
options.add_argument('--lang=zh_-8')
'''2、⾃定义位置'''
options.binary_location(binary_path="D:")
driver = webdriver.Chrome(executable_path="D:",chrome_options=options)
driver.get("")
1、添加启动参数:
如下为⼀些可⽤的chrome启动参数:
–user-data-dir=”[PATH]” 指定⽤户⽂件夹User Data路径,可以把书签这样的⽤户数据保存在系统分区以外的分区。
--disk-cache-dir=”[PATH]“ 指定缓存Cache路径
--disk-cache-size= 指定Cache⼤⼩,单位Byte
--first run 重置到初始状态,第⼀次运⾏
--incognito 隐⾝模式启动
--disable-javascript 禁⽤Javascript
--omnibox-popup-count=”num” 将地址栏弹出的提⽰菜单数量改为num个。
--user-agent=”xxxxxxxx” 修改HTTP请求头部的Agent字符串,可以通过about:version页⾯查看修改效果
--disable-plugins 禁⽌加载所有插件,可以增加速度。可以通过about:plugins页⾯查看效果
--disable-javascript 禁⽤JavaScript,如果觉得速度慢在加上这个
--disable-java 禁⽤java
--start-maximized 启动就最⼤化
--no-sandbox 取消沙盒模式
--single-process 单进程运⾏
--process-per-tab 每个标签使⽤单独进程
--process-per-site 每个站点使⽤单独进程
--in-process-plugins 插件不启⽤单独进程
--disable-popup-blocking 禁⽤弹出拦截
--disable-plugins 禁⽤插件
--disable-images 禁⽤图像
--incognito 启动进⼊隐⾝模式
--enable-udd-profiles 启⽤账户切换菜单
--proxy-pac-url 使⽤pac代理 [via 1/2]
--lang=zh-CN 设置语⾔为简体中⽂
--disk-cache-dir ⾃定义缓存⽬录
--disk-cache-size ⾃定义缓存最⼤值(单位byte)
--media-cache-size ⾃定义多媒体缓存最⼤值(单位byte)
--bookmark-menu 在⼯具 栏增加⼀个书签按钮
--enable-sync 启⽤书签同步
--single-process 单进程运⾏Google Chrome
--start-maximized 启动Google Chrome就最⼤化
--disable-java 禁⽌Java
--no-sandbox ⾮沙盒模式运⾏
使⽤⽅法来添加,如下⽰例:
_argument(value)
1、使⽤⽤户⾃定义设置来启动;
options = webdriver.ChromeOptions
options.add_argument('--user-data-dir=C:/Users/user_name/AppData/Local/Google/Chrome/User Data')
其中user_name为本机使⽤⽤户名称,由于测试⽤chrome安装在默认位置,故路径为代码所⽰地址;此参数⽤于有时候我们使⽤chrome
浏览器做⾃动化时⼀些设置⽆法在代码中进⾏配置,故需要使⽤⾃定义设置的浏览器配置来启动的情况;
需要注意的事此时运⾏启动chrome浏览器需要把现有的chrome浏览器关掉才可以运⾏,不然会报错,否则则会启动⼀个全新的浏览器;
2、模拟iphone⼿机启动
options = webdriver.ChromeOptions
options.add_argument('user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mo
bile/13B143 Safari/601.1"'
3、设置浏览器最⼤化
options = webdriver.ChromeOptions
options.add_argument('--start-maximized')
4、忽略证书报错
options = webdriver.ChromeOptions
options.add_argument("--test-type", "--ignore-certificate-errors")
5、不打开浏览器界⾯,即headless模式
options = webdriver.ChromeOptions
options.add_argument("--headless")
2、设置chrome⼆进制⽂件位置
启动浏览器时也可以⾃⼰指定的位置,代码如下所⽰:
options = webdriver.ChromeOptions
options.binary_location(binary_path="D:")
3、添加扩展应⽤
添加扩展输⼊参数为扩展⽂件路径
options = webdriver.ChromeOptions
options.add_extension("D:")
4、添加chrome设置
options = webdriver.ChromeOptions
prefs = {
't_content_setting_values' : {
'images' : 2
}
}
options.add_experimental_option('prefs',prefs)
5、添加代理
PROXY = "proxy_host:proxy:port"
options = webdriver.ChromeOptions()
desired_capabilities = options.to_capabilities()
desired_capabilities['proxy'] = {
"httpProxy":PROXY,
"ftpProxy":PROXY,
"sslProxy":PROXY,
"noProxy":None,
"proxyType":"MANUAL",
"class":"",
"autodetect":False
}
driver = webdriver.Chrome(desired_capabilities = desired_capabilities)
2、firefox浏览器
(1)、driver获取
(2)、启动firefox
简单启动⽅法为:
def testName(self):
driver = webdriver.Firefox(executable_path="D:")
driver.get("")
带其他参数的启动⽅法为:
1、带启动参数
def testName(self):
options = webdriver.FirefoxOptions;
options.add_argument("-devtools","-tray")
driver = webdriver.Firefox(executable_path="D:",firefox_options=options)
driver.get("")
如下为⼀些常⽤的启动参数的说明:
2、设定启动exe⽂件路径
options = webdriver.FirefoxOptions;
binary = "D:"
driver = webdriver.Firefox(executable_path="D:",firefox_binary=binary)
driver.get("")
3、headless模式启动
此模式为不打开浏览器的模式,即隐藏启动模式;
options = webdriver.FirefoxOptions;
options.headless(True)
driver = webdriver.Firefox(executable_path="D:",firefox_options=options,firefox_binary=binary)
driver.get("")
4、参数设置(不常⽤)
此处类似chrome浏览器的添加设置,使⽤基本⽅法如下:
options = webdriver.FirefoxOptions
options.headless(True)
options.set_preference("List", 2)
options.set_preference("", "d:java")
binary = "D:"
driver = webdriver.Firefox(executable_path="D:",firefox_options=options,firefox_binary=binary)
driver.get("")
上⾯例⼦中为设定⽕狐浏览器⾃动下载⽬录的设置;
5、添加⽤户⾃定义设置
此处可以添加⽤户⾃定义的设置,基本使⽤⽅法如下:
def testName(self):
options = webdriver.FirefoxOptions
options.headless(True)
options.profile(webdriver.FirefoxProfile("C:Program FilesMozilla Firefox Formalprofile"))
binary = "D:"
driver = webdriver.Firefox(executable_path="D:",firefox_options=options,firefox_binary=binary)
driver.get("")
制作profile的⽅法如下:
1、关闭所有Filefox浏览窗—》运⾏Firefox Manager,点击windows“开始”–>“运⾏”,然后在输⼊框输⼊ -
ProfileManager,点击“确定”按钮-》创建⼀个新的Profile,只需点击“创建配置⽂件”按钮,在接着出现的向导窗⼝⾥输⼊配置⽂件
名;
2、现在就创建了⼀个独⽴的Firefox Profile配置⽂件,启动Profile配置⽂件的Firefox;
3、新建⼀个bat⽂件,输⼊命令⾏
set MOZ_NO_REMOTE=1
start “” “C:Program FilesMozilla Firefox ” -P firefoxprofile⽂件名;
3、在新打开的浏览器中,你可以随意设置⽕狐,这些设置都保存在你的个性化firefoxprofile中;
6、添加代理
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy, ProxyType
my_proxy = “http://localhost:8080”
'''此处key值不⽌这⼏个,具体看⽂档'''
proxy = Proxy({
'proxyType': ProxyType.MANUAL,
'httpProxy': my_proxy,
'noProxy': ''
})
driver = webdriver.Firefox(proxy = proxy, executable_path="C:/spider/")
driver.delete_all_cookies()
driver.maximize_window()
driver.get("/ip")
print(driver.page_source)
driver.quit()
3、ie浏览器
(1)、driver获取
(2)、启动ie浏览器
基本启动⽅法为:
driver = webdriver.Ie(executable_path="D:")
driver.get("")
1、带启动参数
def testName(self):
options = webdriver.IeOptions
options.headless(True)
driver = webdriver.Ie(executable_path="D:",ie_options=options)
driver.get("")
2、headless模式启动
此处于firefox还有chrome的⽤法相同,设置headless为True即可;
3、添加代理
添加代理也于firefox相同;
⼆、浏览器关闭和基础操作
1、浏览器关闭
代码如下:
def testName(self):
options = webdriver.IeOptions
driver = webdriver.Ie(executable_path="D:",ie_options=options)
driver.get("")
driver.close()
driver.quit()
close和quit⽅法都可以关闭浏览器,不同之处在于,close⽅法只会关闭当前的页⾯,driver不会被关闭;(此⽅法会导致webDriver的临时
⽂件不会被删除)
⽽使⽤quit⽅法则不仅会关闭浏览器,也会关闭session,且清除临时⽂件;
故如果只是关闭多个浏览器中的⼀个这种可以使⽤close⽅法,但是所有⽤例结束务必使⽤quit⽅法,这样最彻底;
2、浏览器的⼀些基本操作⽅法
def testName(self):
options = webdriver.IeOptions
driver = webdriver.Ie(executable_path="D:",ie_options=options)
driver.get("")
driver.title#title
获取当前页⾯的
driver.current_url#url
获取当前页⾯的
driver.quit()
三、浏览器的⼤⼩设定和位置设定
代码和说明如下:
def testName(self):
options = webdriver.IeOptions
driver = webdriver.Ie(executable_path="D:",ie_options=options)
driver.get("")
driver.maximize_window()#
最⼤化浏览器
driver.minimize_window()#
最⼩化浏览器
driver.fullscreen_window()#
浏览器全屏
#(200,300)
设置浏览器位置,在以屏幕左上⾓为原点的坐标处
driver.set_window_position(200, 300, windowHandle='current')
#(200,300)150450
设置浏览器⼤⼩和位置,位置在坐标处,⼤⼩为长,⾼
driver.set_window_rect(200, 300, 150, 450)
#150450
设置浏览器⼤⼩,长,⾼
driver.set_window_size(150, 450, windowHandle='current')
driver.quit()
四、浏览器的前进后退刷新和cookie操作
代码和说明如下:
def testName(self):
options = webdriver.IeOptions
driver = webdriver.Ie(executable_path="D:",ie_options=options)
driver.get("")
driver.back()#
后退
driver.forward()#
前进
driver.refresh()#
刷新
driver.get_cookie('name')#keynamecookie
获取为的的值
driver.get_cookies()#cookie
获取全部的
driver.add_cookie({'name':'foo', 'value':'bar'})#cookie
添加
五、等待设置
超时设置分为三种,分别为显性等待,隐性等待和强制等待,下⾯分别说明:
1、隐式等待
此等待⽅式为全局共⽤,此处共有三个⽅法,分别为查找元素的等待超时时间、页⾯加载等待超时时间和js脚本运⾏超时时间,⽅法如下代
码所⽰:
options = webdriver.IeOptions
driver = webdriver.Ie(executable_path="D:",ie_options=options)
driver.get("")
driver.set_page_load_timeout(30)#30s
⽹页加载超时为
driver.set_script_timeout(30)#js30s
脚本运⾏超时
driver.implicitly_wait(30)#30s
元素查找超时时间
2、强制等待
此种等待⽅法直接调⽤()⽅法来进⾏线程等待,由于此⽅法较为死板,不够灵活,会导致脚本运⾏时间变长,故建议尽量少⽤;
from selenium import webdriver
import time
def testName(self):
options = webdriver.IeOptions
driver = webdriver.Ie(executable_path="D:",ie_options=options)
driver.get("")
time.sleep(10)#10s
睡眠,强制
driver.quit()
3、显式等待
此种⽅式⽤于特定元素、特定条件的等待,使⽤灵活,建议使⽤这种⽅法来进⾏等待设置,基本操作操作⽅法如下:
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions
def testName(self):
options = webdriver.IeOptions
driver = webdriver.Ie(executable_path="D:",ie_options=options)
driver.get("")
#30s0.1(0.5s)
显式等待,超时,没秒查询⼀次如果不设置则默认,等待条件为元素显⽰
WebDriverWait(driver, 30, 0.1, ignored_exceptions=None).until(driver.find_element_by_id("AAA").is_displayed())
#30s0.1(0.5s)
显式等待,超时,没秒查询⼀次如果不设置则默认,等待条件为元素不显⽰
WebDriverWait(driver, 30, 0.1, ignored_exceptions=None).until_not(driver.find_element_by_id("AAA").is_displayed(),"未显⽰")
#selenium
使⽤⾃带条件
WebDriverWait(driver, 30, 0.1, ignored_exceptions=None).until(expected_conditions.alert_is_present)
selenium提供有许多已经设定好的条件,可以直接取⽤;
六、元素查找和操作
1、元素查找
元素查找有较多⽅式,常⽤为通过id,name,className,xpath和css选择器⽅法;
from selenium import webdriver
def testName(self):
options = webdriver.IeOptions
driver = webdriver.Ie(executable_path="D:",ie_options=options)
driver.get("")
#classclass
通过元素的属性的值来查找,属性重复较多,看情况使⽤
driver.find_element_by_class_name("div")
#idid
通过元素的属性的值来查找,通常如果有属性,则其值基本为唯⼀,建议使⽤
driver.find_element_by_id('a')
#namename
通过元素的属性的值来查找,属性⼤多也是唯⼀,建议使⽤
driver.find_element_by_name("name")
#atexttext
⽤于标签的,此⽅法需传⼊完整的
driver.find_element_by_link_text("link_text")
#atexttext
⽤于标签的,此⽅法⽆需传⼊完整的,⼀部分即可
driver.find_element_by_partial_link_text("link_text")
#tagtag
根据元素的名称来查询元素,由于⼤多数元素的名称均不是唯⼀,故不常⽤此⽅法
driver.find_element_by_tag_name("name")
#xpathidname
根据元素的来进⾏元素查询,⽤于⽆唯⼀的或者的情况,较为准确且常⽤
driver.find_element_by_xpath("xpath")
#cssxpath
根据元素的选择器来进⾏元素查询,有些情况写起来⽐要短
driver.find_element_by_css_selector("css_selector")
如下说明均以此图⽚为例:
(1) xpath写法说明
(1.1)、标准写法
标准写法为,⽐如我们要找那个title为搜索热点的元素,则就是这样写(这⾥属性值⽤
//标签名[@属性名="属性值"]xpath//div[@title='搜索热点']
单引号或者双引号都可以,这个意思是从全局元素始中查找);
//
(1.2)、获取⽗元素
获取兄弟元素,这个就可以先定位到其⽗元素,再下级寻找,⽐如上图黄⾊标识那个元素,xpath就可以这样写;
//div[@title='搜索热点']/../table
(1.3)、获取兄弟元素
获取兄弟元素,这个就可以先定位到其⽗元素,再下级寻找,⽐如上图黄⾊标识那个元素,xpath就可以这样写//div[@title=‘搜索热
点’]/…/table;
(1.4)、获取⼦元素
⼦元素获取,⼦元素的话就⽐较简单了,可以直接在元素后加就可以了,譬如要获取上图中第⼆个标签的元素,则xpath可以写
[n]td
为,注意这个中的2即为其编号,这⾥编号都是从1开始,如果是第⼀个
//a[@title='谢霆锋⼭寨歌迷会'][text()='谢霆锋⼭寨歌迷会']/../../../td[2]td[2]
td则可以不⽤加后边那个;
[1]
(1.5)、多属性⽅式定位
有时候我们⽤单⼀属性进⾏查找还是会有重复的元素,那么怎么办呢,其实属性我们可以加多个,譬如上图中那个a标签元素,其xpath就
可以这样写,注意那个[text()=‘谢霆锋⼭寨歌迷会’]为text的专有写法;
//a[@title='谢霆锋⼭寨歌迷会'][text()='谢霆锋⼭寨歌迷会']
(2)css选择器写法说明
与通过xpath查找类似,这个也可以直接在chrome中点击要定位的元素右键选择cssSelector来获取其css选择器,不过和xpath⼀样有时
候会很长…不如⾃⼰写的简单(需要注意的是css选择器⽅式有时候写起来⽐xpath要简单许多,建议这个好好学习下);
(1.1)、通过id⽅式
这⾥的selector可以写为或者带tag名称的⽅式,其中为类似div这种,则是该元素的id属性
#id_valuetag_name#id_valuetag_nameid_value
的值;
(1.2)、通过class⽅式
此处selector可以写为或者带tag名称的⽅式,此处的为元素的class属性的value值;
.class_valuetag__valueclass_value
(1.3)、通过其他属性的⽅式
此处selector可以写为或者,此种⽅式也可以带个tag名称,直接加在中括号前⾯即可;
[attr_name="attr_value"][attr_name='attr_value']
(1.4)、通过tag_name的⽅式
此处selector写法为,这样可以直接获取到所有标签名为的元素,结果同tagName查找⽅式;
tag_nametag_name
(1.5)、通过路径⽅式
2、元素操作
如下为常⽤元素操作代码和含义
element = driver.find_element_by_id("id_")
element.clear()#
清除内容,常⽤于输⼊框
element.send_keys("string")#input
往输⼊框输⼊字符串
element.submit()#form
表单的提交按钮
element.get_attribute("name")#
获取属性值,⼊参为属性名称
element.get_property("name")#get_attributehtml
获取属性值,⼊参为属性名称,这个和是差不多的,但是两者在页⾯上有些不同,⼤部分我们需要的属性是随
便这两个⽅法都可以获取到的
element.value_of_css_property("property_name")#css
获取某个属性的值
element.tag_name#tage
获取元素的名称
element.text#
获取元素的⽂本内容
element.size#
获取元素的⼤⼩
element.location#
获取元素的位置
element.is_displayed()#
元素是否显⽰
element.is_enabled()#
元素是否可⽤
element.is_selected()#
元素是否被选择
element.screenshot("filename")#filename
截图并保存到⽂件路径为的⽂件中
element.screenshot_as_base64#64
截图并保存为位格式
element.screenshot_as_png#
截图并保存为⼆进制形式
七、frame切换
driver.switch_to_default_content()#framehtml
切换到顶层,即当前的根页⾯
driver.switch_to.default_content()#
同上,写法不同
driver.switch_to_frame(element)#frameelementframe
切换到否个,为该的元素
driver.switch_to.frame(element)#
同上
driver.switch_to.parent_frame()#frameframe
切换到当前所在的⽗级
需要注意的是如果是多层frame,那么就得要⼀层层的切换,⽽不能直接切换到所要的那个frame。
⼋、多窗⼝切换
多窗⼝切换这个功能并不常⽤。可⽤⽅法如下所⽰:
driver.window_handles#
获取当前所有窗⼝的句柄
driver.current_window_handle#
获取当前窗⼝的句柄
driver.switch_to_window(windows_handle)#
切换到窗⼝,⼊参为要切换的窗⼝的句柄
九、select框选择
要使⽤selenium的select模块,需要先导⼊,如下:
from selenium.webdriver.support.select import Select
⽽后就可以使⽤select模块了,可以使⽤的⽅法如下:
s = driver.find_element_by_id("nr")#Select
获取以作为标签名的元素
Select(s).select_by_index(2)#option
根据其下的索引,选择⼦项
Select(s).select_by_value("value")#value
根据⼦项的属性的值来选择
Select(s).select_by_visible_text("text")#
根据⼦项的⽂本值来选择
Select(s).all_selected_options#
返回所有被选择的⼦项的元素列表
Select(s).first_selected_option#
返回第⼀个被选择的⼦项获取当前被选择的⼦项
Select(s).deselect_all()#
全部去选择
Select(s).deselect_by_index(2)#
根据索引去选择
Select(s).deselect_by_value("value")#value
根据属性的值去选择
Select(s).deselect_by_visible_text("text")#
根据⽂本框的值去选择
⼗、⿏标键盘操作
这部分使⽤ActionChains,需要先导⼊模块:
from selenium.webdriver.common.action_chains import ActionChains
其使⽤⽅法如下所⽰:
'''左键单击'''
ActionChains(driver).click(element).perform()#
左键点击元素,⼊参为元素
ActionChains(driver).move_to_element(element).click().perform()#
同上
'''右键单击'''
ActionChains(driver).context_click(element).perform()#
右键点击元素,⼊参为元素
ActionChains(driver).move_to_element(element).context_click().perform().perform()#
同上
'''双击'''
ActionChains(driver).double_click(element).perform()#
左键双击元素,⼊参为元素
ActionChains(driver).move_to_element(element).double_click().perform()#
同上
'''左键点击并保持'''
ActionChains(driver).click_and_hold(element).perform()#d
点击并保持,⼊参为元素
ActionChains(driver).move_to_element(element).click_and_hold().perform()#
同上
'''拖拽'''
ActionChains(driver).drag_and_drop(element, target).perform()#elementtarget
左键点击元素并保持,移动到元素后释放
ActionChains(driver).click_and_hold(element).move_to_element(target).release().perform()#
同上
ActionChains(driver).drag_and_drop_by_offset(element, 200, 300).perform()#element200300
点击元素并保持,⽽后横向移动,再纵向移动后松开⿏标左键
;
'''移动元素'''
ActionChains(driver).move_by_offset(200, 300).perform()#(200,300)
以当前⿏标位置为原点,移动⿏标到坐标位置处
ActionChains(driver).move_to_element_with_offset(target, 200, 300).perform()#targettarget(200,300)
移动⿏标到元素处,且再以元素左上⾓坐标为原点移动
偏移量
'''键盘操作'''
ActionChains(driver).send_keys(Keys.ALT).perform()#ALT
直接发送模拟键的输⼊
ActionChains(driver).send_keys_to_element(element, Keys.DELETE,Keys.END).perform()#elementDELETEEND
向元素发送模拟和键的输⼊
ActionChains(driver).key_up(Keys.DOWN, element).perform()#elementDOWN
模拟键盘向元素按下键
ActionChains(driver).key_down(Keys.SPACE, element).perform()#elementSPACEkey_up
模拟键盘向元素松开键,此项常和配合使⽤
上⾯的键盘操作,需要先导⼊Keys,如下:
from selenium.webdriver.common.keys import Keys
⼗⼀、全屏截图和元素截图
截图的话在前⾯元素操作那⾥有做说明,这⾥再做下说明:
全屏截图⽅法如下:
driver.get_screenshot_as_base64()#base64
截取当前窗⼝且保存为以编码的字符串中
driver.get_screenshot_as_png()#
截图当前窗⼝并以⼆进制保存
driver.get_screenshot_as_file("filename")#filename
截图当前窗⼝并保存到路径为的⽂件中
元素截图⽅法类似,如下:
element.screenshot("filename")#filename
截图并保存到⽂件路径为的⽂件中
element.screenshot_as_base64#base64
截图并保存为编码格式的字符串
element.screenshot_as_png#
截图并保存为⼆进制形式
⼗⼆、执⾏javascript
⽅法如下:
driver.execute(driver_command, params)#cmd
执⾏命令
driver.execute_script(script)#jsscript
执⾏脚本,同步执⾏,⼊参除了这个,还可以加多个参数
driver.execute_async_script(script)#jsscript
执⾏脚本,异步执⾏,⼊参除了这个,还可以加多个参数
举例说明:
driver.execute_script("Height")#html
返回这个页⾯的⾼度
⼗三、alert操作
⽅法如下所⽰
driver.switch_to_alert().accept()#//
点击接受同意确定按钮
driver.switch_to_alert().dismiss()#
反之,不同意
driver.switch_to_alert().send_keys("value")#
发送字符串
driver.switch_to_alert().text#alert
获取的内容
发布评论