??? 交流討論:歡迎加入我們一起學(xué)習(xí)!
?? 資源分享:耗時200+小時精選的「軟件測試」資料包
???教程推薦:火遍全網(wǎng)的《軟件測試》教程??
??歡迎點贊 ?? 收藏 ?留言 ?? 如有錯誤敬請指正!
一、selenium介紹
Selenium 是支持web瀏覽器自動化的一系列工具和庫的綜合項目,能夠進行自動化網(wǎng)頁瀏覽器操作,廣泛應(yīng)用于測試和自動化行業(yè)。它可以模擬用戶在瀏覽器中執(zhí)行的操作,如點擊按鈕、填寫表單、導(dǎo)航到不同頁面等。Selenium 提供了一組強大的 API 和工具,使開發(fā)人員能夠以編程方式控制瀏覽器,從而實現(xiàn)自動化測試、網(wǎng)頁抓取和跨瀏覽器測試等任務(wù)。
官網(wǎng):https://www.selenium.dev/zh-cn/documentation/
特點:
多語言支持:Selenium 提供了多種編程語言的 API,例如 Java、Python、C#、Ruby 等,使開發(fā)人員可以使用自己熟悉的語言編寫測試腳本。
跨瀏覽器兼容性:Selenium 支持各種流行的瀏覽器,包括Chrome、Firefox、Safari 和 Edge等,可以在不同瀏覽器上執(zhí)行測試并驗證應(yīng)用程序的一致性。
強大的定位機制:Selenium 提供了豐富的元素定位方法,如通過 ID、CSS、XPath 等定位方式,使得開發(fā)人員可以準確定位頁面上的元素并與之交互。
自動化與集成:Selenium 可以與常見的集成工具和測試框架(如 TestNG、JUnit、Cucumber 等)無縫集成,使得測試和自動化過程更加靈活高效。
支持分布式測試:Selenium Grid 允許在多臺計算機上并行執(zhí)行測試,以加速測試執(zhí)行和提高效率。
豐富的社區(qū)支持:Selenium 擁有龐大的開發(fā)者社區(qū)和活躍的維護者團隊,提供了豐富的文檔、教程和示例,方便開發(fā)人員學(xué)習(xí)和解決問題。
二、環(huán)境搭建
1、安裝 Selenium 庫
pip install selenium
2、獲取瀏覽器的驅(qū)動程序
1.1 查看谷歌瀏覽器版本(以谷歌瀏覽器作為示例)
Chrome -> 右上角三個點-> 設(shè)置 -> 關(guān)于Google Chrome
1.2 下載對應(yīng)版本的chromedriver
谷歌瀏覽器chromedriver:CNPM Binaries Mirror
3 配置 ChromeDriver 路徑
下載解壓后得到 chromedriver.exe,將其放入 Python 安裝路徑下的 Scripts 目錄
4 編寫 Selenium 腳本驗證安裝
新建python文件,命名open-web.py,使用 ChromeDriver 創(chuàng)建一個 Chrome 瀏覽器實例,打開 "https://www.example.com" 網(wǎng)頁并最后關(guān)閉瀏覽器
from selenium import webdriver
# 創(chuàng)建 ChromeDriver 實例
driver = webdriver.Chrome()
# 打開網(wǎng)頁,填寫你需要的網(wǎng)站
driver.get("https://www.example.com")
# 執(zhí)行其他操作
# ...
# 關(guān)閉瀏覽器0...........
driver.quit()
三、基本組成
1. 使用驅(qū)動實例開啟會話
from selenium import webdriver
driver = webdriver.Chrome()
2. 在瀏覽器上執(zhí)行操作
導(dǎo)航到網(wǎng)頁
driver.get("https://www.selenium.dev/selenium/web/web-form.html")
3. 請求瀏覽器信息
請求一系列關(guān)于瀏覽器的信息, 包括窗口句柄、瀏覽器尺寸/位置、cookie、警報等
title = driver.title
4. 建立等待策略
等待一段時間使元素處于可交互狀態(tài)
driver.implicitly_wait(0.5)
time.sleep(0.5)
5. 發(fā)送命令查找元素
text_box = driver.find_element(by=By.NAME, value="my-text")
submit_button = driver.find_element(by=By.CSS_SELECTOR, value="button")
6. 操作元素
text_box.send_keys("Selenium")
submit_button.click()
7. 獲取元素信息
value = message.text
8. 結(jié)束會話
driver.quit()
四、元素
1.查詢
根據(jù)提供的定位值定位元素.
#評估DOM元素,查找匹配的第一個元素
driver.find_element(By.CLASS_NAME, "tomatoes")
#評估DOM子集,縮小范圍,通過父元素定位子元素
fruits = driver.find_element(By.ID, "fruits")
fruit = fruits.find_element(By.CLASS_NAME,"tomatoes")
#使用 CSS 或 XPath 在單個命令中找到此元素
fruit = driver.find_element(By.CSS_SELECTOR,"#fruits .tomatoes")
#獲取所有匹配元素
plants = driver.find_elements(By.TAG_NAME, "li")
#循環(huán)訪問集合并確定所需的集合
elements = driver.find_elements(By.TAG_NAME, 'p')
for e in elements:
print(e.text)
2. 定位器
在DOM中標(biāo)識一個或多個特定元素的方法
新版本:
名稱 | 含義 | 定位元素 |
---|---|---|
類名 | 定位class屬性與搜索值匹配的元素(不允許使用復(fù)合類名) | By.ID |
CSS 選擇器 | 定位 CSS 選擇器匹配的元素 | By.XPATH |
編號 | 定位 id 屬性與搜索值匹配的元素 | By.LINK_TEXT |
名字 | 定位 name 屬性與搜索值匹配的元素 | By.PARTIAL_LINK_TEXT |
鏈接文本 | 定位link text可視文本與搜索值完全匹配的錨元素 | By.NAME |
部分鏈接文本 | 定位link text可視文本部分與搜索值部分匹配的錨點元素。 如果匹配多個元素,則只選擇第一個元素。 | By.TAG_NAME |
標(biāo)簽名稱 | 定位標(biāo)簽名稱與搜索值匹配的元素 | By.CLASS_NAME |
xpath | 定位與 XPath 表達式匹配的元素 | By.CSS_SELECTOR |
例:
單個元素:driver.find_element(By.CSS_SELECTOR, "#fname")
多個元素:driver.find_elements(By.CSS_SELECTOR, "#fname")
舊版本:
定位元素 | 含義 |
---|---|
find_element_by_id | 通過元素 id 進行定位 |
find_element_by_name | 通過元素名稱進行定位 |
find_element_by_xpath | 通過 xpath 表達式進行定位 |
find_element_by_link_text | 通過完整超鏈接文本進行定位 |
find_element_by_partial_link_text | 通過部分超鏈接文本進行定位 |
find_element_by_tag_name | 通過標(biāo)記名稱進行定位 |
find_element_by_class_name | 通過類名進行定位 |
find_element_by_css_selector | 通過 css 選擇器進行定位 |
例:
單個元素:driver.find_element_by_id('username')
多個元素:driver.find_elements_by_id('username')
3. 信息
3.1 是否顯示
是否正確顯示在網(wǎng)頁上. 返回一個 Boolean 值, 如果連接的元素顯示在當(dāng)前的瀏覽器上下文中,則為True,否則返回falseis_email_visible = driver.find_element(By.NAME, "email_input").is_displayed()
3.2 是否啟用
檢查所連接的元素在網(wǎng)頁上是啟用還是禁用狀態(tài)。 返回一個布爾值,如果在當(dāng)前瀏覽上下文中是啟用狀態(tài),則返回 true,否則返回 false。value = driver.find_element(By.NAME, 'button_input').is_enabled()
3.3 是否被選定
此方法確認相關(guān)的元素是否已選定,常用于復(fù)選框、單選框、輸入框和選擇元素中。
該方法返回一個布爾值,如果在當(dāng)前瀏覽上下文中 選擇了 引用的元素,則返回 True,否則返回 False。value = driver.find_element(By.NAME, "checkbox_input").is_selected()
3.4 獲取元素標(biāo)簽名
此方法用于獲取在當(dāng)前瀏覽上下文中具有焦點的被引用元素的TagName。attr = driver.find_element(By.NAME, "email_input").tag_name
3.5 位置和大小
用于獲取參照元素的尺寸和坐標(biāo)。
提取的數(shù)據(jù)主體包含以下詳細信息:
元素左上角的X軸位置
元素左上角的y軸位置
元素的高度
元素的寬度
res = driver.find_element(By.NAME, "range_input").rect
3.6 獲取元素CSS值
獲取當(dāng)前瀏覽上下文中元素的特定計算樣式屬性的值。cssValue = driver.find_element(By.ID, "namedColor").value_of_css_property('background-color')
3.7 文本內(nèi)容
獲取特定元素渲染后的文本內(nèi)容。text = driver.find_element(By.ID, "justanotherlink").text
3.8 獲取特性或?qū)傩?/h4>
獲取與 DOM 屬性關(guān)聯(lián)的運行時的值。 它返回與該元素的 DOM 特性或?qū)傩躁P(guān)聯(lián)的數(shù)據(jù)。
email_txt = driver.find_element(By.NAME, "email_input")
value_info = email_txt.get_attribute("value")
#獲取鏈接
例:article.find_elements_by_xpath("/a")[j].get_attribute('href')
五、交互
1. 元素交互
1.1 點擊
元素點擊命令執(zhí)行在元素中央。如果元素中央由于某些原因被遮擋 , Selenium將返回一個元素點擊中斷錯誤。driver.find_element(By.NAME, "input").click()
1.2 發(fā)送鍵位
元素發(fā)送鍵位命令將錄入提供的鍵位到編輯的元素。通常, 這意味著元素是具有文本類型的表單的輸入元素或具有內(nèi)容可編輯屬性的元素. 如果不可編輯, 則返回?zé)o效元素狀態(tài)錯誤。driver.find_element(By.NAME, "email_input").send_keys("abc")
1.3 清除
元素清除命令重置元素的內(nèi)容. 這要求元素可編輯, 且可重置。 通常, 這意味著元素是具有文 類型的表單的輸入元素或具有內(nèi)容可編輯屬性的元素. 如果不滿足這些條件, 將返回?zé)o效元素狀態(tài)錯誤.driver.find_element(By.NAME, "email_input").clear()
2. 瀏覽器交互(獲取瀏覽器信息)
2.1 獲取標(biāo)題
driver.title
2.2 獲取當(dāng)前url
driver.current_url
3. 瀏覽器導(dǎo)航
3.1 打開網(wǎng)站
driver.get("https://selenium.dev")
3.2 后退
driver.back()
3.3 前進
driver.forward()
3.4 刷新
driver.refresh()
4. 彈窗
4.1 Alerts 警告框
它顯示一條自定義消息, 以及一個用于關(guān)閉該警告的按鈕, 在大多數(shù)瀏覽器中標(biāo)記為"確定"(OK). 在大多數(shù)瀏覽器中, 也可以通過按"關(guān)閉"(close)按鈕將其關(guān)閉, 但這始終與“確定”按鈕具有相同的作用
# 導(dǎo)入所需的模塊和類
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 實例化瀏覽器驅(qū)動
driver = webdriver.Chrome()
# 點擊鏈接以激活彈窗
driver.find_element(By.LINK_TEXT, "See an example alert").click()
# 等待彈窗顯示并將其存儲在變量中
wait = WebDriverWait(driver, 10)
alert = wait.until(EC.alert_is_present())
# 將彈窗文本存儲在變量中
text = alert.text
# 點擊確定按鈕
alert.accept()
#點擊取消按鈕
alert.dismiss()
4.2 Confirm 確認框
確認框類似于警告框, 不同之處在于用戶還可以選擇取消消息
# 點擊鏈接以激活確認框
driver.find_element(By.LINK_TEXT, "See a sample confirm").click()
# 等待確認框的出現(xiàn),expected_conditions重命名為EC
wait = WebDriverWait(driver, 10)
wait.until(EC.alert_is_present())
# 將確認框存儲在變量中以便復(fù)用
alert = driver.switch_to.alert
# 將確認框文本存儲在變量中
text = alert.text
# 點擊取消按鈕
alert.dismiss()
4.3 Prompt 提示框
提示框與確認框相似, 不同之處在于它們還包括文本輸入. 與處理表單元素類似, 您可以使用WebDriver的sendKeys來填寫響應(yīng). 這將完全替換占位符文本. 按下取消按鈕將不會提交任何文本
# 等待提示框的出現(xiàn)
wait = WebDriverWait(driver, 10)
wait.until(EC.alert_is_present())
# 將提示框存儲在變量中以便復(fù)用
alert = Alert(driver)
# 輸入消息
alert.send_keys("Selenium")
# 點擊確定按鈕
alert.accept()
5. 窗口和標(biāo)簽頁
5.1 獲取窗口句柄
WebDriver 沒有區(qū)分窗口和標(biāo)簽頁。如果你的站點打開了一個新標(biāo)簽頁或窗口,Selenium 將允許您使用窗口句柄來處理它。 每個窗口都有一個唯一的標(biāo)識符,該標(biāo)識符在單個會話中保持持久性。你可以使用以下方法獲得當(dāng)前窗口的窗口句柄driver.current_window_handle
5.2 切換窗口或標(biāo)簽頁
單擊在 <a href=“https://seleniumhq.github.io"target="_blank”>新窗口 中打開鏈接, 則屏幕會聚焦在新窗口或新標(biāo)簽頁上,但 WebDriver 不知道操作系統(tǒng)認為哪個窗口是活動的。 要使用新窗口,您需要切換到它。 如果只有兩個選項卡或窗口被打開,并且你知道從哪個窗口開始, 則你可以遍歷 WebDriver, 通過排除法可以看到兩個窗口或選項卡,然后切換到你需要的窗口或選項卡。
# 存儲原始窗口的 ID
original_window = driver.current_window_handle
# 檢查一下,我們還沒有打開其他的窗口
assert len(driver.window_handles) == 1
# 單擊在新窗口中打開的鏈接
driver.find_element(By.LINK_TEXT, "new window").click()
# 等待新窗口或標(biāo)簽頁
wait.until(EC.number_of_windows_to_be(2))
# 循環(huán)執(zhí)行,直到找到一個新的窗口句柄
for window_handle in driver.window_handles:
if window_handle != original_window:
driver.switch_to.window(window_handle)
break
# 等待新標(biāo)簽頁完成加載內(nèi)容
wait.until(EC.title_is("xxxx"))
5.3 創(chuàng)建新窗口或新標(biāo)簽頁并且切換
創(chuàng)建一個新窗口 (或) 標(biāo)簽頁,屏幕焦點將聚焦在新窗口或標(biāo)簽在上。您不需要切換到新窗口 (或) 標(biāo)簽頁。如果除了新窗口之外, 您打開了兩個以上的窗口 (或) 標(biāo)簽頁,您可以通過遍歷 WebDriver 看到兩個窗口或選項卡,并切換到非原始窗口。
# 打開新標(biāo)簽頁并切換到新標(biāo)簽頁
driver.switch_to.new_window('tab')
# 打開一個新窗口并切換到新窗口
driver.switch_to.new_window('window')
5.4 關(guān)閉窗口或標(biāo)簽頁
#關(guān)閉標(biāo)簽頁或窗口
driver.close()
#切回到之前的標(biāo)簽頁或窗口
driver.switch_to.window(original_window)
5.5 在會話結(jié)束時退出瀏覽器
完成了瀏覽器會話,應(yīng)該調(diào)用 quit 退出,而不是 close 關(guān)閉driver.quit()
退出將會:
- 關(guān)閉所有與 WebDriver 會話相關(guān)的窗口和選項卡
- 結(jié)束瀏覽器進程
- 結(jié)束后臺驅(qū)動進程
- 通知 Selenium Grid 瀏覽器不再使用,以便可以由另一個會話使用它(如果您正在使用 Selenium Grid)
5.6 獲取窗口大小
# 分別獲取每個尺寸
width = driver.get_window_size().get("width")
height = driver.get_window_size().get("height")
# 或者存儲尺寸并在以后查詢它們
size = driver.get_window_size()
width1 = size.get("width")
height1 = size.get("height")
5.7 設(shè)置窗口大小
driver.set_window_size(1024, 768)
5.8 窗口位置
# 分別獲取每個尺寸
x = driver.get_window_position().get('x')
y = driver.get_window_position().get('y')
# 或者存儲尺寸并在以后查詢它們
position = driver.get_window_position()
x1 = position.get('x')
y1 = position.get('y')
5.9 設(shè)置窗口位置
# 將窗口移動到主顯示器的左上角
driver.set_window_position(0, 0)
5.10 最大化窗口
driver.maximize_window()
5.11 最小化窗口
driver.minimize_window()
5.12 全屏窗口
填充整個屏幕,類似于在大多數(shù)瀏覽器中按下 F11driver.fullscreen_window()
5.12 屏幕截圖
用于捕獲當(dāng)前瀏覽上下文的屏幕截圖. WebDriver端點屏幕截圖 返回以Base64格式編碼的屏幕截圖driver.save_screenshot('./image.png')
5.13 元素屏幕截圖
ele = driver.find_element(By.CSS_SELECTOR, 'h1')
ele.screenshot('./image.png')
5.14 執(zhí)行腳本
在當(dāng)前frame或者窗口的上下文中,執(zhí)行JavaScript代碼片段
# 存儲標(biāo)題元素
header = driver.find_element(By.CSS_SELECTOR, "h1")
# 執(zhí)行 JavaScript 代碼以捕獲標(biāo)題元素的 innerText
inner_text = driver.execute_script('return arguments[0].innerText', header)
# 執(zhí)行JavaScript代碼,將頁面滾動到底部
js = "window.scrollTo(0, document.body.scrollHeight);"
driver.execute_script(js)
5.15 打印頁面
from selenium.webdriver.common.print_page_options import PrintOptions
# 實例化打印選項對象
print_options = PrintOptions()
print_options.page_ranges = ['1-2']
# 打開打印頁的網(wǎng)址
driver.get("printPage.html")
# 執(zhí)行打印操作,并獲取打印后的頁面內(nèi)容的 Base64 編碼
base64code = driver.print_page(print_options)
6 Cookies
Cookie是從網(wǎng)站發(fā)送并存儲在您的計算機中的一小段數(shù)據(jù). Cookies主要用于識別用戶并加載存儲的信息。
6.1 添加 Cookie
這個方法常常用于將cookie添加到當(dāng)前訪問的上下文中. 添加Cookie僅接受一組已定義的可序列化JSON對象. 這里是一個鏈接, 用于描述可接受的JSON鍵值的列表
首先, 您需要位于有效Cookie的域上. 如果您在開始與網(wǎng)站進行交互之前嘗試預(yù)設(shè)cookie, 并且您的首頁很大或需要一段時間才能加載完畢, 則可以選擇在網(wǎng)站上找到一個較小的頁面 (通常404頁很小, 例如?http://example.com/some404page)
將 Cookie 添加到當(dāng)前瀏覽器上下文中driver.add_cookie({"name": "key", "value": "value"})
6.2 獲取命名的 Cookie
此方法返回與cookie名稱匹配的序列化cookie數(shù)據(jù)中所有關(guān)聯(lián)的cookie.
# 將 Cookie 添加到當(dāng)前瀏覽器上下文中
driver.add_cookie({"name": "key", "value": "value"})
# 使用命名的 cookie 'key' 獲取 cookie 詳細信息
print(driver.get_cookie("key"))
6.3 獲取全部 Cookies
driver.get_cookies()
6.4 刪除 Cookie
driver.delete_cookie("key")
6.5 刪除所有 Cookies
driver.delete_all_cookies()
6.6 Same-Site Cookie屬性
此屬性允許用戶引導(dǎo)瀏覽器控制cookie, 是否與第三方站點發(fā)起的請求一起發(fā)送. 引入其是為了防止CSRF(跨站請求偽造)攻擊.
Same-Site cookie屬性接受以下兩種參數(shù)作為指令
- Strict:當(dāng)sameSite屬性設(shè)置為 Strict, cookie不會與來自第三方網(wǎng)站的請求一起發(fā)送.
- Lax:將cookie sameSite屬性設(shè)置為 Lax, cookie將與第三方網(wǎng)站發(fā)起的GET請求一起發(fā)送.
driver.add_cookie({"name": "key", "value": "value", 'sameSite': 'Strict'})
driver.add_cookie({"name": "key1", "value": "value", 'sameSite': 'Lax'})
7. IFrames和Frame
遇到嵌套的 iframe(內(nèi)聯(lián)框架),需要定位和切換到 iframe
7.1 使用 WebElement切換
iframe_element = driver.find_element_by_xpath("http://iframe[@id='iframe_id']")
driver.switch_to.frame(iframe_element)
7.2 使用 name 或 id切換
# 通過 id 切換框架
driver.switch_to.frame('buttonframe')
7.3 使用索引切換
# 基于索引切換到第 2 個 iframe
iframe = driver.find_elements(By.TAG_NAME,'iframe')[1]
# 切換到選擇的 iframe
driver.switch_to.frame(iframe)
7.4 切回主文檔
完成 iframe 內(nèi)的操作后,可以使用該方法將焦點切回到主文檔。這將恢復(fù)驅(qū)動器的默認上下文,使后續(xù)的操作在主文檔中進行driver.switch_to.default_content()
六、等待
我們在做WEB自動化時,一般要等待頁面元素加載完成后,才能執(zhí)行操作,否則會報錯找不到元素的錯誤
三種等待方式:
- 隱式等待
- 顯示等待
- 強制等待
1. 隱式等待
Selenium有一種內(nèi)置的方式來自動等待稱為隱式等待的元素。 可以使用瀏覽器選項中的超時功能或使用驅(qū)動程序方法(如下所示)設(shè)置隱式等待值。
這是一個全局設(shè)置,適用于整個會話的每個元素位置調(diào)用。 默認值為 ,這意味著如果未找到該元素,它將 立即返回錯誤。如果設(shè)置了隱式等待,驅(qū)動程序?qū)⒌却?返回錯誤之前所提供值的持續(xù)時間。請注意,只要元素定位,驅(qū)動程序?qū)⒎祷卦匾?,代碼將繼續(xù)執(zhí)行, 因此,較大的隱式等待值不一定會增加會話的持續(xù)時間。缺點:有時需要的元素早已加載完成,個別元素加載慢,仍要等待頁面全部加載完成才能執(zhí)行下一步。
警告:不要混合隱式和顯式等待。 這樣做可能會導(dǎo)致不可預(yù)測的等待時間。 例如,將隱式等待設(shè)置為 10 秒 并顯式等待 15 秒 可能會導(dǎo)致 20 秒后發(fā)生超時driver.implicitly_wait(2)
2. 顯式等待
顯式等待是一種條件觸發(fā)式的等待方式,指定某一條件直到這個條件成立時才會繼續(xù)執(zhí)行,可以設(shè)置超時時間,如果超過這個時間元素依然沒被加載,就會拋出異常。element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "http://div//input"))
或者例下:
revealed = driver.find_element(By.ID, "revealed")
wait = WebDriverWait(driver, timeout=2)
driver.find_element(By.ID, "reveal").click()
wait.until(lambda d : revealed.is_displayed())
revealed.send_keys("Displayed")
3. 強制等待
利用time模塊的sleep方法來實現(xiàn),使程序等待一段時間time.sleep(time)
4. 其他
Selenium提供了一些內(nèi)置的用于顯式等待的方法,位于expected_conditions類中,方法名稱如表所示:
內(nèi)置方法 | 功能 |
---|---|
title_is | 判斷當(dāng)前頁面的title 是否等于預(yù)期內(nèi)容 |
title_contains | 判斷當(dāng)前頁面的 title 是否包含預(yù)期字符串 |
presence_of_element_located | 判斷某個元素是否被加到了 dom 樹里,并不代表該元素一定可見 |
visibility_of_element_located | 判斷某個元素是否可見 |
visibility_of | 判斷某個元素是否可見 |
presence_of_all_elements_located | 判斷是否至少有 1個元素存在于 dom 樹中 |
text_to_be_present_in_element | 判斷某個元素中的 text 是否包含了預(yù)期的字符串 |
text_to_be_present_in_element_value | 判斷某個元素中的 value 屬性是否包含了預(yù)期的字符串 |
frame tobe availableand switch toit | 判斷該 frame 是否可以切換進去,如果可以的話,返回 True并且切換進去,否則返回 False |
invisibility_of_element_located | 判斷某個元素中是否不存在于 dom 樹或不可見 |
element_tobeclickable | 判斷某個元素中是否可見并且是 enable 的 |
stalenessof | 等待某個元素從 dom樹中移除 |
element_tobeselected | 判斷某個元素是否被選中了,一般用于下拉列表 |
element_located to be_selected | 判斷某個元素是否被選中了,一般用于下拉列表 |
element_selection_statetobe | 判斷某個元素的選中狀態(tài)是否符合預(yù)期 |
element_located_selection_state_to_be | 判斷某個元素的選中狀態(tài)是否符合預(yù)期 |
alert_is_present | 判斷頁面上是否存在 alert 框 |
七、Web自動化測試示例
這是本人空閑時間寫的一個招標(biāo)信息獲取自動化測試,里面基本涵蓋了上述selenium內(nèi)容,附加了注釋,日期、excel表格讀取和寫入,貼近日常工作。
import time
import pandas as pd
import glob
import openpyxl
import traceback
from openpyxl.styles import Border, Side, Alignment
from datetime import datetime,timedelta
from pathlib import Path
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 指定桌面路徑
keyword_path = Path.home() / '招標(biāo)/關(guān)鍵詞'
save_path = Path.home() / '招標(biāo)/結(jié)果'
# 獲取當(dāng)日日期``````````
today = time.strftime("%Y-%m-%d", time.localtime())
# 獲取昨天的日期時間
yesterday = datetime.now() - timedelta(days=1)
yesterday_start = yesterday.replace(hour=0, minute=0, second=0, microsecond=0)
# 獲取今天的日期時間
thetoday = datetime.now()
today_start = thetoday.replace(hour=0, minute=0, second=0, microsecond=0)
# 格式化日期時間
yesterday_formatted = yesterday_start.strftime("%Y-%m-%d %H:%M:%S")
today_formatted = today_start.strftime("%Y-%m-%d %H:%M:%S")
# 創(chuàng)建空的case列表
case = []
# 創(chuàng)建空的結(jié)果列表
result_list = []
def read_excel():
global case
# 查找以"關(guān)鍵詞"開頭的Excel文件
file_pattern = str(keyword_path / '關(guān)鍵詞*.xlsx')
file_list = glob.glob(file_pattern)
# 讀取第一個匹配到的Excel文件
if file_list:
file_path = file_list[0]
df = pd.read_excel(file_path)
case = df['關(guān)鍵字'].values.tolist()
else:
print("未找到匹配的Excel文件")
#網(wǎng)站1數(shù)據(jù)獲取
def search_results():
global result_list
global case
# 打開第一個網(wǎng)站
driver.get("http://118.64.254.72/freecms/site/juncai//cggg/index.html")
# 等待頁面加載完全
time.sleep(2)
#進入采購大廳
purchase_notice1 = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, "http://ul[@class='nav-tab']//li/span[contains(text(),'采購大廳')]"))
)
purchase_notice1.click()
# 等待搜索結(jié)果加載完全
time.sleep(1)
driver.find_element_by_xpath("http://div[@class='layui-input-inline']//input[@id='stateDate']").send_keys(yesterday_formatted)
driver.find_element_by_xpath("http://div[@class='layui-input-inline']//input[@id='endDate']").send_keys(today_formatted)
driver.find_element_by_xpath(
"http://div[@class='layui-col-md3']//div[@class='layui-form-select']//i[@class ='layui-edge']").click()
time.sleep(1)
driver.find_element_by_xpath(
"http://div[@class='layui-input-inline layui-form']//dl/dd[contains(text(),'全部')]").click()
driver.find_element_by_xpath(
"http://div[@class='layui-col-md3']//div[@class='layui-form-select']//i[@class ='layui-edge']").click()
for i, keyword in enumerate(case):
# 在第一個網(wǎng)站中搜索關(guān)鍵詞
keyword_str = str(keyword)
search_input1 = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "input[name='identity']")))
search_input1.clear()
search_input1.send_keys(keyword)
search_button = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, "http://button[contains(@class,'layui-btn-normal')]"))
)
search_button.click()
# 等待搜索結(jié)果加載完全
time.sleep(1)
# 循環(huán)處理每一頁的搜索結(jié)果
while True:
# 獲取當(dāng)前頁的搜索結(jié)果
articles = driver.find_elements(By.XPATH, "http://div[@class='searchBoxBottom']//ul/li/a/..")
if articles:
for j, article in enumerate(articles):
# 獲取搜索結(jié)果的信息
Announcement_title =article.find_elements_by_xpath("http://div[@class='searchBoxBottom']//ul/li/a/span/p[@class='ellipsis']")[j].text
Announcement_type = article.find_elements_by_xpath("http://div[@class='searchBoxBottom']//ul/li/a/span[contains(@style,'margin-left: 42px')]")[j].text
Announcement_time = article.find_elements_by_xpath("http://div[@class='searchBoxBottom']//ul/li/a/span[contains(@style,'margin-right: 15px')]")[j].text
Announcement_link = article.find_elements_by_xpath("http://div[@class='searchBoxBottom']//ul/li/a")[j].get_attribute('href')
result_list.append([keyword_str, Announcement_type, Announcement_title, Announcement_time, Announcement_link])
time.sleep(1)
# 判斷是否存在下一頁按鈕
next_page_buttons = driver.find_elements(By.XPATH, "http://div[@class='pagination' and not(contains(@style,'display: none'))]//li[contains(text(),'>') and not(@class='disabled')]")
if len(next_page_buttons) > 0:
# 點擊下一頁按鈕
next_page_button = next_page_buttons[0]
next_page_button.click()
# 等待搜索結(jié)果加載完全
time.sleep(1)
else:
break
time.sleep(1)
return result_list
#創(chuàng)建excel保存數(shù)據(jù)
def creat_excel(result_list):
# 創(chuàng)建Excel工作簿
wb = openpyxl.Workbook()
sheet = wb.active
last_row = 0
# 設(shè)置表頭
sheet['A1'] = '關(guān)鍵詞'
sheet['B1'] = '公告類型'
sheet['C1'] = '標(biāo)題'
sheet['D1'] = '時間'
sheet['E1'] = 'URL'
# 遍歷result_list中的數(shù)據(jù),并逐個寫入Excel單元格
for i, result in enumerate(result_list):
keyword_str, Announcement_type, Announcement_title, Announcement_time, Announcement_link = result
# 從第二行開始寫入,因為第一行是表頭
last_row = i + 2
sheet.cell(row=last_row, column=1, value=keyword_str)
sheet.cell(row=last_row, column=2, value=Announcement_type)
sheet.cell(row=last_row, column=3, value=Announcement_title)
sheet.cell(row=last_row, column=4, value=Announcement_time)
sheet.cell(row=last_row, column=5, value=Announcement_link)
# 創(chuàng)建邊框樣式
border = Border(
left=Side(border_style="thin", color="000000"),
right=Side(border_style="thin", color="000000"),
top=Side(border_style="thin", color="000000"),
bottom=Side(border_style="thin", color="000000")
)
# 設(shè)置邊框樣式、對齊方式和行高
for row in sheet.iter_rows(min_row=1, max_row=last_row, min_col=1, max_col=5):
for cell in row:
cell.border = border
cell.alignment = Alignment(wrap_text=True, vertical="center")
sheet.row_dimensions[cell.row].height = 40
# 設(shè)置列寬
sheet.column_dimensions['A'].width = 19
sheet.column_dimensions['B'].width = 10
sheet.column_dimensions['C'].width = 21
sheet.column_dimensions['D'].width = 12
sheet.column_dimensions['E'].width = 40
# 保存Excel文件
file_name = f'結(jié)果_{today}.xlsx'
file_path = save_path / file_name
wb.save(file_path)
wb.close()
print("數(shù)據(jù)已寫入Excel文件:", file_path)
if __name__ == '__main__':
try:
read_excel()
# 創(chuàng)建Chrome瀏覽器實例
driver = webdriver.Chrome()
driver.maximize_window()
#調(diào)用函數(shù)
search_results()
# 關(guān)閉網(wǎng)站
driver.quit()
creat_excel(result_list=result_list)
except Exception as e:
print(traceback.format_exc())
八、總結(jié)
本文主要介紹了selenium的部署使用、組成元素、交互操作等基本內(nèi)容,后續(xù)還有一些進階內(nèi)容,例如Actions接口,驗證碼識別、腳本執(zhí)行等等,我也會結(jié)合python編寫實用的程序供大家參考。至此,selenium的基礎(chǔ)學(xué)習(xí)完結(jié),但學(xué)無止境,繼續(xù)加油
最后我邀請你進入我們的【軟件測試學(xué)習(xí)交流群:785128166】, 大家可以一起探討交流軟件測試,共同學(xué)習(xí)軟件測試技術(shù)、面試等軟件測試方方面面,還會有免費直播課,收獲更多測試技巧,我們一起進階Python自動化測試/測試開發(fā),走向高薪之路
作為一個軟件測試的過來人,我想盡自己最大的努力,幫助每一個伙伴都能順利找到工作。所以我整理了下面這份資源,現(xiàn)在免費分享給大家,有需要的小伙伴可以關(guān)注【公眾號:程序員二黑】自提!
文章來源:http://www.zghlxwxcb.cn/news/detail-839808.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-839808.html
到了這里,關(guān)于Web自動化測試--selenium的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!