Selenium是最流行的web端自動化測試框架之一,用於自動執行用戶對被測產品的操作。Selenium是開源的,Selenium框架的核心組件是Selenium WebDriver。 Selenium WebDriver允許使用者在不同的瀏覽器(例如Chrome,Firefox,Internet Explorer,Microsoft Edge等)上執行測試用例。使用Selenium WebDriver的主要優點是它支持.NET,Java,C#,Python等。可以參考有關Selenium WebDriver體系結構的官方文檔以了解更多信息。
儘管Selenium簡化了Web網站或Web應用程式的測試,但測試開發人員在使用框架時面臨著許多Selenium自動化挑戰。讓我們看一下Selenium Automation中面臨的一些最常見挑戰及其比較不錯的解決方案。
誤報成功和誤報失敗
誤報成功也是測試結果成功的一種情況,即使實際情況並非如此。反之亦然,誤報失敗是測試失敗一種情況,即使一切都按預期進行,測試結果也會報告腳本執行過程中出現錯誤。誤報對自動化測試一直是最大的挑戰,當然Selenium也不例外。
當測試工程師通過Selenium腳本運行成百上千的測試用例時,可能會遇到一些不穩定的測試,這些測試顯示誤報。如果長時間不處理,可能會導致整個自動化測試項目失去價值,從而使測試人員的自動化測試腳本淪為「廢物」。
測試腳本的穩定性無疑是Selenium自動化中最常見的挑戰之一。目前通用的解決辦法依然缺少,但從過往工作經驗來看,測試左移,獨立測試環境,統計腳本誤報率等等從流程上來解決這個難題是一個不錯的思路。
等待網頁加載JavaScript
現在很多網站包含需要JS異步加載Web元素,例如基於用戶選擇的下拉列表。則Selenium腳本在運行時可能會在這些Web元素時突然失效。發生這種情況是因為WebDriver沒有處理網頁完全加載所花費的時間。為了處理頁面加載的Selenium自動化中的異步加載的問題,需要使WebDriver等到該頁面的完整JavaScript加載完成之後再進行操作。在任何網頁上執行測試之前,您應確保該網頁(尤其是帶有很多JavaScript代碼的網頁)的加載已完成。您可以使用readyState屬性,該屬性描述文檔/網頁的加載狀態。document.readyState狀態為complete表示頁面/文檔的解析已完成。
&39;&39;&39;
import pytest
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from time import sleep
from contextlib import contextmanager
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.expected_conditions import staleness_of
@pytest.fixture(params=[&34;],scope=&34;)
def driver_init(request):
if request.param == &34;:
web_driver = webdriver.Chrome()
request.cls.driver = web_driver
yield
web_driver.close()
@pytest.mark.usefixtures(&34;)
class BasicTest:
pass
class Test_URL(BasicTest):
def test_open_url(self):
self.driver.get(&34;)
print(self.driver.title)
sleep(5)
def wait_for_page_load(self, timeout=30):
old_page = self.driver.find_element_by_id(&39;)
yield
WebDriverWait(self.driver, timeout).until(
staleness_of(old_page)
)
def test_click_operation(self):
39;FREE SIGN UP&34;return document.readyState& 並不完美的方案
from selenium import webdriver
import time
from time import sleep
driver = webdriver.Firefox()
driver.get(&34;)
資源釋放
driver.close()
使用Selenium WebDriver動態內容處理此挑戰的更好方法是使用隱式等待或顯式等待,這取決於各自的需求。
顯式等待處理動態內容
使用顯式等待,您可以使Selenium WebDriver停止執行並等待直到滿足特定條件。如果您希望設置條件以等待到確切的時間段,則可以將它與thread.sleep()函數一起使用。有多種方法可以實現顯式等待,帶有ExpectedCondition的WebDriver是最受歡迎的選項。
from selenium import webdriver
from time import sleep
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
driver = webdriver.Firefox()
driver.get(&34;)
try:
myElem_1 = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, &39;)))
print(&34;)
myElem_2 = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, &39;)))
print(&34;)
myElem_2.click()
sleep(10)
34;No element found&34;https://www.*****.com&34;home-btn&34;元素不存在!&34;耗時 &39;-secs&34;create_alert_dialogue()&34;submit&34;測試彈框,請點擊繼續!&34;file://<HTML File location>&34;submit&34;ok,跳過警告框&34;file://<HTML File location>&34;***&34;***&34;submit&39;超時&34;沒有發現警告框&34;http://www.****.com/html/codes/html_popup_window_code.cfm&獲取當前窗口的窗口句柄
parent_window = driver.window_handles[0]
print(parent_window)
39;result1&39;show_iframe&獲取子窗口的句柄
child_window = driver.window_handles[1]
子窗口來到前臺
driver.switch_to.window(child_window)
title2 = driver.title
print(title2)
print(child_window)
34;__main__":
unittest.main()
無法測試行動裝置
儘管Selenium框架已廣泛用於跨瀏覽器和作業系統的不同組合測試網站或Web應用程式,但該測試仍僅限於非行動裝置。因此,測試針對行動裝置的網站或Web應用程式是Selenium自動化面臨的重大挑戰之一。
如果對行動應用程式執行測試自動化測試,那麼最著名的開源框架將是Appium。
無法自動化一切
100%自動化是一個吹牛的命題。眾所周知的是,並非所有測試方案都可以自動化,因為有些測試需要手動幹預。您需要確定團隊在自動化測試上相對於手動測試應花費的精力的優先級。儘管Selenium框架具有一些功能,可以通過這些功能來截取屏幕截圖,記錄視頻(測試的整體執行情況)以及可視化測試的其他方面,但是將這些功能與可擴展的基於雲的跨瀏覽器測試平臺一起使用可能會具有很大的價值。
生成測試報告
任何測試活動的主要目的是發現BUG並改善整體產品。在跟蹤正在執行的測試,生成的輸出和測試結果方面,報告可以發揮主要作用。儘管有可以與pytest和Selenium一起使用的模塊,例如pytest_html(對於Python),但是測試報告中的信息可能並不十分詳盡。Selenium可以使用不同類型的程式語言(例如Java,C#、.Net等)的類似模塊/包,但是這些語言仍然存在相同的問題。收集測試報告是Selenium自動化中的關鍵挑戰之一。
很多基於Selenium的第三方雲測平臺,還有很多公司基於Selenium開發的自己的報告框架提取,一般來說從以下幾個方面豐富報告信息:
檢索構建信息,例如構建測試狀態,單個測試狀態,測試運行時間,錯誤和測試日誌
通過命令獲取屏幕截圖
瀏覽器環境的詳細信息
有所不能
上面提到的是Selenium自動化中的一些常見挑戰,就Selenium而言存在一些限制。只能使用Selenium框架來測試Web應用程式,即不能用於測試基於本地Windows的應用程式。在某些情況下可能需要使用這些場景,出於安全目的,因此自動化測試很難甚至永遠無法繞過一些嚴格身份驗證。
請關注+私信回覆:「測試」就可以免費拿到軟體測試學習資料。