一、環(huán)境準(zhǔn)備
Selenium安裝
命令行安裝
pip install selenium
瀏覽器驅(qū)動安裝
找到本地chrome的瀏覽器的版本


下載相應(yīng)版本的驅(qū)動器
chrome瀏覽器驅(qū)動下載
地址:chromedriver.storage.googleapis.com/index.html

下載完后,解壓到本地的python的目錄下

geckodriver:
https://firefox-source-docs.mozilla.org/testing/geckodriver/Support.html
edgedriver:
https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/#downloads
iedriver:
https://selenium-release.storage.googleapis.com/index.html
selenium原理
對于每一條Selenium腳本,一個http請求會被創(chuàng)建并且發(fā)送給瀏覽器的驅(qū)動,瀏覽器驅(qū)動中包含了一個HTTP Server,用來接收這些http請求,HTTP Server接收到請求后根據(jù)請求來具體操控對應(yīng)的瀏覽器,瀏覽器執(zhí)行具體的測試步驟,瀏覽器將步驟執(zhí)行結(jié)果返回給HTTP Server,HTTP Server又將結(jié)果返回給Selenium的腳本,如果是錯誤的http代碼我們就會在控制臺看到對應(yīng)的報錯信息。

二、Selenium入門實例
import time
#導(dǎo)入包
from selenium import webdriver
# 創(chuàng)建瀏覽器驅(qū)動
driver = webdriver.Chrome()
# 打開網(wǎng)頁
driver.get('http://localhost:8909/fIndex')
# 停止三秒
time.sleep(3)
# 退出瀏覽器
driver.quit()
彈出瀏覽器,自動打開http://localhost:8909/fIndex,三秒后自動退出瀏覽器

三、元素定位
selenium元素定位方式類型
Selenium提供了八種定位元素方式
1.id
2.name
3.class_name
4.tag_name
5.link_text
6.partial_link_text
7.XPath
8.CSS
id定位元素
find_element_by_id
find_element_by_id,如果匹配到多個id,取得是第一個元素的值;
element=driver.find_element_by_id(id)

import time
#導(dǎo)入包
from selenium import webdriver
# 創(chuàng)建瀏覽器驅(qū)動
driver = webdriver.Chrome()
# 打開網(wǎng)頁
driver.get('http://localhost:8909/fIndex')
driver.find_element_by_id('box').click()
# 停止三秒
time.sleep(3)
# 退出瀏覽器
# driver.quit()

find_elements_by_id
find_elements_by_id,如果匹配多多個元素,就是一個集合,我們可以通過索引打開相應(yīng)的元素;
elements=driver.find_elements_by_id(id)
import time
#導(dǎo)入包
from selenium import webdriver
# 創(chuàng)建瀏覽器驅(qū)動
driver = webdriver.Chrome()
# 打開網(wǎng)頁
driver.get('http://localhost:8909/fIndex')
driver.find_elements_by_id('box')[1].click()
# 停止三秒
time.sleep(3)
# 退出瀏覽器
# driver.quit()

name定位元素
find_element_by_name

import time
#導(dǎo)入包
from selenium import webdriver
# 創(chuàng)建瀏覽器驅(qū)動
driver = webdriver.Chrome()
# 打開網(wǎng)頁
driver.get('http://www.baidu.com')
driver.find_element_by_name('tj_briicon').click()
# 停止三秒
time.sleep(3)
# 退出瀏覽器
# driver.quit()

class_name定位元素
find_element_by_class_name

import time
#導(dǎo)入包
from selenium import webdriver
# 創(chuàng)建瀏覽器驅(qū)動
driver = webdriver.Chrome()
# 打開網(wǎng)頁
driver.get('http://localhost:8909/fIndex')
driver.find_element_by_class_name('el-input__inner').send_keys("測試")
# 停止三秒
time.sleep(3)
# 退出瀏覽器
# driver.quit()

tag_name定位元素
find_element_by_tag_name
import time
#導(dǎo)入包
from selenium import webdriver
# 創(chuàng)建瀏覽器驅(qū)動
driver = webdriver.Chrome()
# 打開網(wǎng)頁
driver.get('http://localhost:8909/fIndex')
driver.find_element_by_tag_name('input').send_keys('input')
# 停止三秒
time.sleep(3)
# 退出瀏覽器
# driver.quit()

partial_link_text定位元素
find_element_by_partial_link_text
說明:partial_link_text定位是對link_text定位的補充,link_text使用全部文本內(nèi)容匹配元素,而partial_link_text可以使用局部來匹配元素,也可以使用全部文本內(nèi)容匹配元素。

import time
#導(dǎo)入包
from selenium import webdriver
# 創(chuàng)建瀏覽器驅(qū)動
driver = webdriver.Chrome()
# 打開網(wǎng)頁
driver.get('http://localhost:8909/fIndex')
driver.find_element_by_partial_link_text('百度').click()
# 停止三秒
time.sleep(3)
# 退出瀏覽器
# driver.quit()

link_text定位元素
link_text
說明:link_text定位是專門用來定位超鏈接元素(<a>標(biāo)簽,并且是通過超鏈接的文本內(nèi)容來定位元素)
import time
#導(dǎo)入包
from selenium import webdriver
# 創(chuàng)建瀏覽器驅(qū)動
driver = webdriver.Chrome()
# 打開網(wǎng)頁
driver.get('http://localhost:8909/fIndex')
driver.find_element_by_link_text('百度').click()
# 停止三秒
time.sleep(3)
# 退出瀏覽器
# driver.quit()
Xpath定位元素
element=driver.find_element_by_xpath(xpath)
Xpath絕對路徑定位
絕對路徑:從最外層元素到指定元素之間所有經(jīng)過元素層級的路徑
1).絕對路徑以/html根節(jié)點開始,使用/來分隔元素層級;
如:/html/body/div/fieldset/p[1]/input
2).絕對路徑對頁面結(jié)構(gòu)要求比較嚴(yán)格,不建議使用
import time
#導(dǎo)入包
from selenium import webdriver
# 創(chuàng)建瀏覽器驅(qū)動
driver = webdriver.Chrome()
# 打開網(wǎng)頁
driver.get('http://localhost:8909/fIndex')
driver.find_element_by_xpath('/html/body/section/header/div/div[3]/div/div/input').send_keys('XPath絕對定位')
# 停止三秒
time.sleep(3)
# 退出瀏覽器
# driver.quit()

Xpath相對路徑


定位
1).相對路徑以//開始
2).格式://input或者//*
import time
#導(dǎo)入包
from selenium import webdriver
# 創(chuàng)建瀏覽器驅(qū)動
driver = webdriver.Chrome()
# 打開網(wǎng)頁
driver.get('http://localhost:8909/fIndex')
driver.find_element_by_xpath('//input[@placeholder="搜索帖子"]').send_keys('絕對定位')
# 停止三秒
time.sleep(3)
# 退出瀏覽器
# driver.quit()
CSS定位元素
element=driver.find_element_by_css_selector(css_selector)

CSS定位常用策略(方式)
1.id選擇器
2.class選擇器
3.元素選擇器
4.屬性選擇器
5.層級選擇器
id選擇器
說明:根據(jù)元素id屬性來選擇
格式:#id
例如:#userA<選擇id屬性值為userA的元素>
class選擇器
說明:根據(jù)元素class屬性來選擇
格式:.class
例如:.telA<選擇class屬性值為telA的所有元素>
元素選擇器
說明:根據(jù)元素的標(biāo)簽名選擇
格式:element
例如:input<選擇所有input元素>
屬性選擇器
說明:根據(jù)元素的屬性名和值來選擇
格式:element[attribute=value]
例如:[type="password"]<選擇type屬性值為password的元素>
import time
#導(dǎo)入包
from selenium import webdriver
# 創(chuàng)建瀏覽器驅(qū)動
driver = webdriver.Chrome()
# 打開網(wǎng)頁
driver.get('http://localhost:8909/fIndex')
driver.find_element_by_css_selector('input[placeholder="搜索帖子"]').send_keys('CSS定位')
# 停止三秒
time.sleep(3)
# 退出瀏覽器
# driver.quit()

XPath與CSS類似功能對比
定位方式 |
Xpath |
CSS |
元素名 |
//input |
input |
id |
//input[@id='userA'] |
#userA |
class |
//*[@class='telA'] |
.telA |
屬性 |
1.//*[text()="xxx"] 2.//input[starts-with(@attribute,'xxx')] 3.//input[contains(@attribute,'xxx')] |
1.input[type^='p'] 2.input[type$='d'] 3.input[type*='w'] |
四、定位元素的另一種寫法
方法:find_element(by=By.ID,value=None)
備注:需要兩個參數(shù),第一個參數(shù)為定位的類型由By提供,第二個參數(shù)為定位的具體方式
示例:
#導(dǎo)包
from selenium.webdriver.common.by import By
from selenium import webdriver
# 創(chuàng)建瀏覽器驅(qū)動
driver = webdriver.Chrome()
# 打開網(wǎng)頁
driver.get('http://localhost:8909/fIndex')
driver.find_element(By.CSS_SELECTOR,'#emailA').send_keys("123@126.com")
driver.find_element(By.XPATH,'//*[@id="emailA"]').send_keys('234@qq.com')3.driver.find_element(By.ID,"userA").send_keys("admin")
driver.find_element(By.NAME,"passwordA").send_keys("123456")
driver.find_element(By.CLASS_NAME,"telA").send_keys("18611111111")
driver.find_element(By.TAG_NAME,'input').send_keys("123")
driver.find_element(By.LINK_TEXT,'訪問新浪網(wǎng)站').click()
driver.find_element(By.PARTIAL_LINK_TEXT,'訪問').click()
五、元素操作|瀏覽器操作方法
元素常用操作方法
1.click() 單擊元素
2.send_key() 給輸入框輸入值
3.clear() 輸入框清空
瀏覽器操作
1.maximize_window() 最大化瀏覽器窗口
2.set_window_size(width,height) 設(shè)置瀏覽器窗口大小
3.set_window_position(x,y) 設(shè)置瀏覽器窗口位置
4.back() 退回
5.forward() 前進
6.refresh() 刷新
7.close() 關(guān)閉窗口
8.quilt() 關(guān)閉瀏覽器驅(qū)動對象
9.title 獲取瀏覽器標(biāo)題
10.current_url 獲取當(dāng)前頁面URL
11.window_handles 先獲取所有窗口的句柄
import time
#導(dǎo)入包
from selenium import webdriver
# 創(chuàng)建瀏覽器驅(qū)動
driver = webdriver.Chrome()
# 打開網(wǎng)頁
driver.get('http://localhost:8909/fIndex')
#最大化瀏覽器
driver.maximize_window()
#刷新
driver.refresh()
#后退
driver.back()
#前進
driver.forward()
#設(shè)置瀏覽器大小
driver.set_window_size(300,300)
#設(shè)置瀏覽器位置
driver.set_window_position(300,200)#關(guān)閉瀏覽器單個窗口
driver.close()
#關(guān)閉瀏覽器所有窗口
driver.quit()
#獲取title
title=driver.title
#獲取當(dāng)前頁面url
url=driver.current_url
# 退出瀏覽器
# driver.quit()
切換窗口練習(xí)
import time
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://localhost:8909/fIndex')
element = driver.find_element_by_xpath('//button[@type="button" and contains(@class,"el-button--default")]')
element.click()
# 獲取瀏覽器窗口
windows = driver.window_handles
# 切換到第一個窗口
driver.switch_to.window(windows[0])
獲取元素信息
1. size 返回元素大小
2. text 獲取元素的文本
3. get_attribute("xxx") 獲取屬性值,傳遞的參數(shù)為元素的屬性名
4. is_displayed() 判斷元素是否可見
5. is_enabled() 判斷元素是否可用
6. is_selected() 判斷元素是否選中,用來檢查復(fù)選框或單選按鈕是否被選中
提示:
1. size、text:為屬性,調(diào)用時無括號;如:xxx.size
六、鼠標(biāo)和鍵盤操作
鼠標(biāo)操作
說明:在Selenium中將操作鼠標(biāo)的方法封裝在ActionChains類中
實例化對象:
action = ActionChains(driver)
方法:
1. context_click(element) 右擊 --> 模擬鼠標(biāo)右鍵點擊效果
2. double_click(element) 雙擊 --> 模擬鼠標(biāo)雙擊效果
3. drag_and_drop(source, target) 拖動 --> 模擬鼠標(biāo)拖動效果
4. move_to_element(element) 懸停 --> 模擬鼠標(biāo)懸停效果
5. perform() 執(zhí)行 --> 此方法用來執(zhí)行以上所有鼠標(biāo)操作
為了更好的學(xué)習(xí)其他方法,我們先學(xué)習(xí)perform()執(zhí)行方法,因為所有的方法都需要執(zhí)行才能生效
鼠標(biāo)右鍵-context_click()
說明:對于點擊鼠標(biāo)右鍵,如果彈出的是瀏覽器默認(rèn)的菜單,Selenium沒有提供操作菜單選項的方法;
如果是自定義的右鍵菜單,則可以通過元素定位來操作菜單中的選項。
import time
#導(dǎo)入包
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
# 創(chuàng)建瀏覽器驅(qū)動
driver = webdriver.Chrome()
# 打開網(wǎng)頁
driver.get('http://localhost:8909/fIndex')
action = ActionChains(driver)
element = driver.find_element_by_css_selector('input[placeholder="搜索帖子"]').send_keys('CSS定位')
action.context_click(element)
action.perform()
# 停止三秒
time.sleep(3)
# 退出瀏覽器
# driver.quit()
鼠標(biāo)雙擊-double_click()
import time
#導(dǎo)入包
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
# 創(chuàng)建瀏覽器驅(qū)動
driver = webdriver.Chrome()
# 打開網(wǎng)頁
driver.get('http://localhost:8909/fIndex')
action = ActionChains(driver)
element = driver.find_element_by_css_selector('button[type="button"]>span')
action.double_click(element)
action.perform()
# 停止三秒
time.sleep(3)
# 退出瀏覽器
# driver.quit()
鼠標(biāo)拖動-drag_and_drop()
1. 源元素 source = driver.find_element_by_id(xxx)
2. 目標(biāo)元素 target = driver.find_element_by_id(xxx)
3. 調(diào)用方法 action.drag_and_drop(source, target).perform()
鼠標(biāo)懸停-move_to_element()
說明: 模擬鼠標(biāo)懸停在指定的的元素上
鍵盤操作
常用的鍵盤操作
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') 復(fù)制(Ctrl+C)
提示:以上方法就不一個一個講解了,因為調(diào)用方法都一樣;
DEMO
import time
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://localhost:8909/fIndex')
element = driver.find_element_by_xpath('//input[@type="text"]')
element.send_keys('測試一下,刪除')
time.sleep(2)
#刪除鍵
element.send_keys(Keys.BACK_SPACE)
time.sleep(2)
# 全選
element.send_keys(Keys.CONTROL, 'a')
time.sleep(2)
# 復(fù)制
element.send_keys(Keys.CONTROL, 'c')
time.sleep(2)
# 粘貼
element.send_keys(Keys.CONTROL, 'v')

七、等待方式
隱示等待
概念:定位元素時,如果能定位到元素則直接返回該元素,不觸發(fā)等待; 如果不能定位到該元
素,則間隔一段時間后再去定位元素; 如果在達到最大時長時還沒有找到指定元素,則拋出元素
不存在的異常 NoSuchElementException 。
方法:driver.implicitly_wait(timeout)(timeout:為等待最大時長,單位:秒)
說明:隱式等待為全局設(shè)置(只需要設(shè)置一次,就會作用于所有元素)
顯示等待
概念:定位指定元素時,如果能定位到元素則直接返回該元素,不觸發(fā)等待; 如果不能定位到該
元素,則間隔一段時間后再去定位元素; 如果在達到最大時長時還沒有找到指定元素,則拋出超
時異常 TimeoutException 。
顯式等待是針對單一元素或一組元素進行智能等待,通過expected_conditions選擇等待條件
wait = WebDriverWait(driver,10)
wait.until(expected_conditions.element_to_be_clickable(By.ID, 'xx')) #直到條件滿足
wait.until_not(expected_conditions.element_to_be_clickable(By.ID,'xx'))#直到條件不滿足
expected_conditions提供的方法
#1.判斷當(dāng)前頁面的title是否完全等于(==)預(yù)期字符串,返回是布爾值
title_is
#2.判斷當(dāng)前頁面的title是否包含預(yù)期字符串,返回布爾值
title_contains
#3.判斷某個元素是否被加到了dom樹里,并不代表該元素一定可見
presence_of_element_located
#4.判斷某個元素是否可見. 可見代表元素非隱藏,并且元素的寬和高都不等于0
visibility_of_element_located
#5.跟上面的方法做一樣的事情,只是上面的方法要傳入locator,這個方法直接傳定位到的element就好了
visibility_of
#6.判斷是否至少有1個元素存在于dom樹中。舉個例子,如果頁面上有n個元素的class都是'column-md-3',那么只要有1個元素存在,這個方法就返回True
presence_of_all_elements_located
#7.判斷某個元素中的text是否 包含 了預(yù)期的字符串
text_to_be_present_in_element
#8.判斷某個元素中的value屬性是否包含 了預(yù)期的字符串
text_to_be_present_in_element_value
#9.判斷該frame是否可以switch進去,如果可以的話,返回True并且switch進去,否則返回False
frame_to_be_available_and_switch_to_it
#10.判斷某個元素中是否不存在于dom樹或不可見
invisibility_of_element_located
#11.判斷某個元素中是否可見并且是enable的,這樣的話才叫clickable
element_to_be_clickable
#12.等某個元素從dom樹中移除,注意,這個方法也是返回True或False
staleness_of
#13.判斷某個元素是否被選中了,一般用在下拉列表>* element_selection_state_to_be:判斷某個元素的選中狀態(tài)是否符合預(yù)期
element_to_be_selected
#14.跟上面的方法作用一樣,只是上面的方法傳入定位到的element,而這個方法傳入locator
element_located_selection_state_to_be
#15.判斷頁面上是否存在alert
alert_is_present
import time
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://localhost:8909/fIndex')
driver.implicitly_wait(10)
element = driver.find_element_by_xpath('//button[@type="button" and contains(@class,"el-button--default")]')
WebDriverWait(driver=driver,timeout=10,poll_frequency=0.5)\
.until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@type="button" and contains(@class,"el-button--default")]')))
element.click()
使用匿名函數(shù)進行判斷
import time
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://localhost:8909/fIndex')
driver.implicitly_wait(10)
element = driver.find_element_by_xpath('//button[@type="button" and contains(@class,"el-button--default")]')
WebDriverWait(driver=driver,timeout=10,poll_frequency=0.5)\
.until(lambda x : x.find_element_by_xpath('//button[@type="button" and contains(@class,"el-button--default")]')
)
element.click()
強制等待
sleep(): 強制等待,設(shè)置固定休眠時間。后腳本的執(zhí)行過程中執(zhí)行 sleep()后線程休眠,而另外兩種線程不休眠。
import time
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://localhost:8909/fIndex')
driver.implicitly_wait(10)
element = driver.find_element_by_xpath('//button[@type="button" and contains(@class,"el-button--default")]')
time.sleep.time(3)
element.click()
八、截圖方式
說明:在Selenium中,提供了截圖方法,我們只需要調(diào)用即可
方法:
整屏截圖:driver.get_screenshot_as_file(imgpath)#imgpath:圖片保存路徑
元素截圖:element.screenshot(imgpath)
一般使用比較多的是整屏幕截圖
下面我們編寫下代碼,場景為一個元素定位不到,隱式等待10秒后,出現(xiàn)報錯,然后截圖保存起來;
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://localhost:8909/fIndex')
driver.implicitly_wait(10)
try:
element = driver.find_element_by_xpath('//button[@type="button1" and contains(@class,"el-button--default")]')
element.click()
except:
driver.get_screenshot_as_file('loggin.png')

九、上傳文件
案例:用戶頭像上傳
adFileUpload=driver.find_element_by_name("file")//定位上傳控件
filePath="C:\\test\\uploadfile\\test.jpg";//定義了一個本地文件的路徑
adFileUpload.send_keys(filePath);//為上傳控件進行賦值操作,將需要上傳的文件的路
徑賦給控件
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://localhost:8909/fIndex')
driver.implicitly_wait(10)
driver.find_element_by_xpath('//span[text()="登錄"]').click()
username=driver.find_element_by_xpath('//input[@placeholder="請輸入用戶名"]')
username.clear()
username.send_keys("admin")
password=driver.find_element_by_xpath('//input[@placeholder="請輸入密碼"]')
password.clear()
password.send_keys('123456')
driver.find_element_by_xpath('//span[text()="立即登錄"]').click()
driver.find_element_by_xpath('//div[@class="userInfo"]/span').click()
WebDriverWait(driver=driver,timeout=10,poll_frequency=0.5)\
.until(expected_conditions.element_to_be_clickable((By.XPATH,'//li[text()="個人信息"]')))
driver.find_element_by_xpath('//li[text()="個人信息"]').click()
fileUpload=driver.find_element_by_xpath('//input[@type="file"]')
fileUpload.send_keys("C:\\Users\\Administrator\Pictures\\boxlist1pic2test.jpg")

十、JS操作
案例:個人信息里的生日修改
在實際操作過程中有一些控件沒有無法直接操作,需要借助js來完成,比如時間控件、隱藏的
select元素、只讀輸入框等等
js1=”document.getElementById('s').value='1987-10-12';”//修改某元素的value值
js2=”document.getElementsByClassName('s')[0].click();”//點擊某一個元素
js3=”document.getElementsByClassName('s')[0].readOnly=’’;”//修改只讀屬性為空,變成可以輸入的元素
driver.execute_script(js3)#執(zhí)行js
十一、iframe處理
說明:在Selenium中封裝了如何切換frame框架的方法
方法:
1). driver.switch_to.frame(frame_reference) --> 切換到指定frame的方法
frame_reference:可以為frame框架的name、id或者定位到的frame元素
2). driver.switch_to.default_content() --> 恢復(fù)默認(rèn)頁面方法
driver.switch_to.parent_frame()--->恢復(fù)到上級iframe頁面方法
在frame中操作其他頁面,必須先回到默認(rèn)頁面,才能進一步操作
測試Iframe地址
https://www.w3school.com.cn/tiy/t.asp?f=eg_js_alert

彈窗確認(rèn)的方式下面再講
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions
driver = webdriver.Chrome()
driver.get("https://www.w3school.com.cn/tiy/t.asp?f=eg_js_alert")
# 切換到iframe頁面
driver.switch_to.frame('iframeResult')
# 顯示等待
WebDriverWait(driver=driver,timeout=10,poll_frequency=0.5).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[text()="試一試"]')))
# 點擊試一試按鈕
driver.find_element(By.XPATH,'//button[text()="試一試"]').click()
# 切換到彈窗
alert = driver.switch_to.alert
# 確認(rèn)彈窗
alert.accept()
# 切換回默認(rèn)的頁面
driver.switch_to.default_content()
# 切換主題
driver.find_element(By.XPATH,'//a[@title="更改主題"]').click()

如果我們沒切換回默認(rèn)頁面,就會報錯,說找不到這個元素,我們注釋掉代碼可以看到;

十二、彈出框處理
網(wǎng)頁中常用的彈出框有三種
1. alert 警告框
2. confirm 確認(rèn)框
3. prompt 提示框
彈窗的形式

彈出框處理方法
說明:Selenium中對處理彈出框的操作,有專用的處理方法;并且處理的方法都一樣
1. 獲取彈出框?qū)ο?/span>
alert = driver.switch_to.alert
2. 調(diào)用
alert.text --> 返回alert/confirm/prompt中的文字信息
alert.accept() --> 接受對話框選項
alert.dismiss() --> 取消對話框選項
大家可以使用一下鏈接都操作下各個類型彈框
只有確認(rèn)的彈框
https://www.w3school.com.cn/tiy/t.asp?f=eg_js_alert
有確認(rèn)和取消的彈框
https://www.w3school.com.cn/tiy/t.asp?f=eg_js_confirm
有輸入框的彈框
https://www.w3school.com.cn/tiy/t.asp?f=eg_js_prompt
有提醒語的彈框
https://www.w3school.com.cn/tiy/t.asp?f=eg_js_alert_2
這里的DEMO和上面的以上,大家可以操作不同的彈窗聯(lián)系下
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions
driver = webdriver.Chrome()
driver.get("https://www.w3school.com.cn/tiy/t.asp?f=eg_js_alert")
# 切換到iframe頁面
driver.switch_to.frame('iframeResult')
# 顯示等待
WebDriverWait(driver=driver,timeout=10,poll_frequency=0.5).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[text()="試一試"]')))
# 點擊試一試按鈕
driver.find_element(By.XPATH,'//button[text()="試一試"]').click()
# 切換到彈窗
alert = driver.switch_to.alert
# 確認(rèn)彈窗
alert.accept()
# 切換回默認(rèn)的頁面
driver.switch_to.default_content()
# 切換主題
driver.find_element(By.XPATH,'//a[@title="更改主題"]').click()
十三、選擇框處理
#對下拉框進行操作時首先要定位到這個下拉框,new 一個Selcet對象,然后對它進行操作
from selenium.webdriver.support.select import Select
#找到下拉選擇框的元素:
select = driver.find_element_by_id("areaID")
#選擇對應(yīng)的選擇項:
Select(select).select_by_visible_text("天津市")#通過可見文本去選擇
Select(select).select_by_value("shanxi")#通過html中的value值去選擇
Select(select).select_by_index(1)#通過index(索引從0開始)選擇
#單選框
#單選按鈕就當(dāng)按鈕處理理解起來就簡單了
r_sex = driver.find_element_by_id("sexID2") #找到單選框元素
r_sex.click() #選擇某個單選項
r_sex.is_selected() #判斷某個單選項是否已經(jīng)被選擇 #返回的是Boolean類型
#復(fù)選框
#多選項的操作和單選的差不多:
checkBox = driver.find_element_by_id("u1") checkbox.click() #點擊復(fù)選框
checkbox.clear() #清除復(fù)選框
checkbox .is_selected() #判斷復(fù)選框是否被選中
checkbox .is_enabled() #判斷復(fù)選框是否可用
單選框
Demo如下:
from selenium.webdriver.support.select import Select
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.w3school.com.cn/tiy/t.asp?f=eg_html_radiobuttons")
driver.switch_to.frame("iframeResult")
#單選框
#單選按鈕就當(dāng)按鈕處理理解起來就簡單了
r_sex = driver.find_element_by_xpath('//input[@value="female"]') #找到單選框元素
r_sex.click() #選擇某個單選項
result = r_sex.is_selected() #判斷某個單選項是否已經(jīng)被選擇 #返回的是Boolean類型
print(result)

復(fù)選框
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.w3school.com.cn/tiy/t.asp?f=eg_html_checkboxes")
#切換到iframe
driver.switch_to.frame("iframeResult")
#復(fù)選框
#多選項的操作和單選的差不多:
Bike = driver.find_element_by_name("Bike")
Bike.click()
Car = driver.find_element_by_name("Car")
Car.click()
selectFlag = Bike .is_selected() #判斷復(fù)選框是否被選中
print(selectFlag)
enableFlag = Bike .is_enabled() #判斷復(fù)選框是否可用
print(enableFlag)

下拉框
import time
from selenium.webdriver.support.select import Select
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.w3school.com.cn/tiy/t.asp?f=eg_html_dropdownbox")
#切換到iframe
driver.switch_to.frame("iframeResult")
#找到下拉選擇框的元素:
select = driver.find_element_by_name("cars")
#選擇對應(yīng)的選擇項:
Select(select).select_by_visible_text("Volvo")#通過可見文本去選擇
time.sleep(2)
Select(select).select_by_value("saab")#通過html中的value值去選擇
time.sleep(2)
Select(select).select_by_index(3)#通過index(索引從0開始)選擇
time.sleep(2)
十四、滾動條操作
說明:selenium中并沒有直接提供操作滾動條的方法,但是它提供了可執(zhí)行JavaScript腳本
的方法,所以我們可以通過JavaScript腳本來達到操作滾動條的目的。
1. 設(shè)置JavaScript腳本控制滾動條
js = "window.scrollTo(0,1000)"
(0:左邊距;1000:上邊距;單位像素)
2. selenium調(diào)用執(zhí)行JavaScript腳本的方法
driver.execute_script(js)
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.w3school.com.cn/index.html")
# 1. 設(shè)置JavaScript腳本控制滾動條
js = "window.scrollTo(0,1000)"
# (0:左邊距;1000:上邊距;單位像素)
# 2. selenium調(diào)用執(zhí)行JavaScript腳本的方法
driver.execute_script(js)

十五、驗證碼處理
方式
說明:Selenium中并沒有對驗證碼處理的方法,在這里我們介紹一下針對驗證碼的幾種常用處理方式
方式:
1). 去掉驗證碼
(測試環(huán)境下-采用)
2). 設(shè)置萬能驗證碼
(生產(chǎn)環(huán)境和測試環(huán)境下-采用)
3). 驗證碼識別技術(shù)
(通過Python-tesseract來識別圖片類型驗證碼;識別率很難達到100%)
4). 記錄cookie
(通過記錄cookie進行跳過登錄)
cookie是什么?

1. Cookie是由Web服務(wù)器生成的,并且保存在用戶瀏覽器上的小文本文件,它可以包含用戶相關(guān)的信息。
2. Cookie數(shù)據(jù)格式:鍵值對組成(python中的字典)
3. Cookie產(chǎn)生:客戶端請求服務(wù)器,如果服務(wù)器需要記錄該用戶狀態(tài),就向客戶端瀏覽器頒發(fā)一個Cookie
數(shù)據(jù)
4. Cookie使用:當(dāng)瀏覽器再次請求該網(wǎng)站時,瀏覽器把請求的數(shù)據(jù)和Cookie數(shù)據(jù)一同提交給服務(wù)器,服務(wù)
器檢
查該Cookie,以此來辨認(rèn)用戶狀態(tài)。
selenium操作cookie
說明:Selenium中對cookie操作提供相應(yīng)的方法
方法:
1. get_cookie(name) --> 獲取指定cookie
name:為cookie的名稱
2. get_cookies() --> 獲取本網(wǎng)站所有本地cookies
3. add_cookie(cookie_dict) --> 添加cookie
cookie_dict:一個字典對象,必選的鍵包括:"name" and "value"
案例
from selenium import webdriver
import time
import requests
#這里我們可以通過使用requests庫去調(diào)用登錄接口,然后,拿到接口返回的cookie的值,然后通過selenium
#把獲取到的值寫入到cookie
driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.add_cookie({'name':'BDUSS','value':'根據(jù)實際填寫'})
time.sleep(3)
driver.refresh()
time.sleep(3)
driver.quit()
Selenium基礎(chǔ)到此結(jié)束,后面會從零開始搭建UI自動化測試框架,感興趣的朋友關(guān)注下,點贊下,謝謝!文章來源:http://www.zghlxwxcb.cn/news/detail-771852.html
后續(xù)更新中。。。。。。。。。。。文章來源地址http://www.zghlxwxcb.cn/news/detail-771852.html
到了這里,關(guān)于Python WEB UI自動化測試(1)-Selenium基礎(chǔ)(史上最詳細,一篇就夠)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!