2023年11月25日发(作者:)

selenim3+Python】界⾯⾃动化测试教程

⼀、打开浏览器

selenium3⽀持基本上⽬前市⾯上最常见的⼏种浏览器,本⽂只写其中的chrome、firefox和ie的相关操作;

1chrome浏览器

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)

2firefox浏览器

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("")

3headless模式启动

此模式为不打开浏览器的模式,即隐藏启动模式;

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

3ie浏览器

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("")

2headless模式启动

此处于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()='谢霆锋⼭寨歌迷会']

2css选择器写法说明

与通过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

获取的内容