午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

使用Selenium WebDriver,Python和Chrome編寫您的第一個(gè)Web測(cè)試

 軟件測(cè)試test 2020-07-28

準(zhǔn)備好WebDriver后,讓我們編寫第一個(gè)Web測(cè)試!測(cè)試將是一個(gè)簡(jiǎn)單的DuckDuckGo搜索。DuckDuckGo是一個(gè)不跟蹤用戶數(shù)據(jù)的搜索引擎。就像任何其他搜索引擎一樣,用戶可以輸入搜索短語并獲得指向匹配網(wǎng)站的鏈接。

在編寫自動(dòng)化代碼之前,最好總是以簡(jiǎn)單的語言編寫測(cè)試過程。編寫程序迫使我們首先考慮被測(cè)行為。這是我們的測(cè)試過程:

  1. 導(dǎo)航到DuckDuckGo主頁

  2. 輸入搜索詞組

  3. 驗(yàn)證:

    1. 結(jié)果顯示在結(jié)果頁面上

    2. 搜索詞出現(xiàn)在搜索欄中

    3. 至少一個(gè)搜索結(jié)果包含搜索短語

這是相當(dāng)基本的,但涵蓋了端到端的典型搜索行為。

代碼

將以下測(cè)試功能添加到tests/test_web.py

def test_basic_duckduckgo_search(browser): URL = 'https://www.' PHRASE = 'panda' browser.get(URL) search_input = browser.find_element_by_id('search_form_input_homepage') search_input.send_keys(PHRASE + Keys.RETURN) link_divs = browser.find_elements_by_css_selector('#links > div') assert len(link_divs) > 0 xpath = f"http://div[@id='links']//*[contains(text(), '{PHRASE}')]" results = browser.find_elements_by_xpath(xpath) assert len(results) > 0 search_input = browser.find_element_by_id('search_form_input') assert search_input.get_attribute('value') == PHRASE

test_basic_duckduckgo_search函數(shù)按照Arrange-Act-Assert模式執(zhí)行我們的測(cè)試過程請(qǐng)注意,測(cè)試函數(shù)聲明了一個(gè)名為的參數(shù)browser,該參數(shù)  與我們用于ChromeDriver設(shè)置和清除的固定裝置相同。每次運(yùn)行此測(cè)試時(shí),pytest都會(huì)自動(dòng)調(diào)用固定裝置并注入WebDriver參考。然后,測(cè)試函數(shù)使用該browser變量進(jìn)行多個(gè)WebDriver調(diào)用。讓我們看看這些調(diào)用是如何工作的。

URL = 'https://www.'

該測(cè)試將DuckDuckGo主頁的URL聲明為變量,以提高可讀性和可維護(hù)性。

PHRASE = 'panda'

這是測(cè)試將使用的搜索短語。由于測(cè)試涵蓋了“基本”搜索,因此該短語并不太重要。其他行使不同行為的測(cè)試應(yīng)使用更復(fù)雜的短語。再次,測(cè)試將其聲明在測(cè)試功能的頂部,以提高可讀性和可維護(hù)性。

browser.get(URL)

測(cè)試的起點(diǎn)是DuckDuckGo主頁。此調(diào)用將瀏覽器導(dǎo)航到給定的URL。被警告,雖然:此調(diào)用并  不會(huì)等待頁面加載。它只是啟動(dòng)加載交互。

search_input = browser.find_element_by_id('search_form_input_homepage')

自動(dòng)化Web交互的第一步是找到目標(biāo)元素。元素可能會(huì)或可能不會(huì)出現(xiàn)在頁面上。自動(dòng)化必須使用  定位器  來查找元素(如果存在),然后構(gòu)造一個(gè)代表該元素的對(duì)象。定位符的類型很多:ID類名,CSS選擇器,XPaths等。定位器將在頁面上找到所有匹配的元素-可能不止一個(gè)。嘗試使用最簡(jiǎn)單的定位器,該定位器將唯一地標(biāo)識(shí)目標(biāo)元素。

要編寫定位器,您需要查看頁面的HTML結(jié)構(gòu)。Chrome DevTools可輕松檢查任何實(shí)時(shí)頁面的標(biāo)記。只需右鍵單擊頁面,然后選擇“檢查”。您可以在“元素”選項(xiàng)卡上查看所有元素。對(duì)于我們的測(cè)試,我們想在DuckDuckGo主頁上找到搜索輸入字段。該元素的  id  屬性值為“ search_form_input_homepage”,如下所示:

我們可以使用WebDriver的find_element_by_id 方法獲取該元素。search_input變量分配了代表頁面上搜索輸入元素的對(duì)象。請(qǐng)記住,由于WebDriver實(shí)例具有隱式等待,因此最多等待10秒鐘,搜索輸入元素才會(huì)出現(xiàn)在頁面上。

search_input.send_keys(PHRASE + Keys.RETURN)

有了元素,我們就可以觸發(fā)與它的交互。send_keys方法將一系列擊鍵發(fā)送到搜索輸入元素,就像人類用戶會(huì)在鍵盤上鍵入一樣。上面的呼叫發(fā)送搜索詞組。最后的RETURN鍵提交搜索。

斷言(1)

link_divs = browser.find_elements_by_css_selector('#links > div')

?

結(jié)果頁面應(yīng)顯示一個(gè)divID為“ links”的div元素,每個(gè)結(jié)果鏈接都有一個(gè)子元素。上面的CSS選擇器可以找到所有這樣的結(jié)果鏈接div。請(qǐng)注意,“元素”是復(fù)數(shù)–此調(diào)用將返回一個(gè)列表。

assert len(link_divs) > 0

測(cè)試必須驗(yàn)證搜索詞是否確實(shí)出現(xiàn)了結(jié)果。assert語句確保在頁面上至少找到一個(gè)結(jié)果鏈接。

斷言(2)

xpath = f"http://div[@id='links']//*[contains(text(), '{PHRASE}')]"

驗(yàn)證是否出現(xiàn)了一些結(jié)果很好,但是我們還應(yīng)該驗(yàn)證結(jié)果是否與我們的搜索詞匹配。我們可以使用XPath來精確定位包含文本中搜索短語的結(jié)果鏈接。XPath比名稱和CSS選擇器復(fù)雜,但它們也更強(qiáng)大。上面的XPath搜索divID為“ links”的鏈接,然后查找包含搜索短語文本的后代。

phrase_results = browser.find_elements_by_xpath(xpath)

此調(diào)用使用先前串聯(lián)的XPath查找所有元素。我們可以將這兩行合并為一,但是將這些行拆分起來更具可讀性和Python風(fēng)格。

assert len(phrase_results) > 0

像先前的斷言一樣,此斷言確保至少找到一個(gè)元素。這是一個(gè)簡(jiǎn)單的健全性檢查。它可以變得更強(qiáng)大-就像驗(yàn)證頁面上的每個(gè)結(jié)果都包含搜索詞組文本一樣-但這很難。并非每個(gè)結(jié)果都可以包含搜索短語的確切文本。例如,某些可能具有大寫字符。對(duì)于高級(jí)驗(yàn)證,定位器和邏輯將需要更加復(fù)雜。由于這是  基本的搜索測(cè)試,因此簡(jiǎn)單的斷言就足夠了。

斷言(3)

search_input = browser.find_element_by_id('search_form_input')

最終斷言驗(yàn)證搜索短語仍出現(xiàn)在搜索輸入中。上面的行與Arrange階段中的find元素調(diào)用相同  。它將再次找到搜索輸入元素。我們?yōu)槭裁床荒?/span>search_input再次使用該對(duì)象?不幸的是,先前的元素已經(jīng)  過時(shí)了。頁面從搜索頁面更改為結(jié)果頁面。即使元素看起來相同,也有所不同,并且還需要一個(gè)新的定位器。因此,我們需要重新獲取它。

assert search_input.get_attribute('value') == PHRASE

?

鍵入輸入元素的文本可作為其“值”屬性訪問。該行斷言“值”屬性等于搜索詞組。它驗(yàn)證該短語沒有消失。

查看并運(yùn)行Web測(cè)試

現(xiàn)在,其完整代碼應(yīng)如下所示(為清晰起見,附加了注釋):tests/test_web.py

"""This module contains web test cases for the tutorial.Tests use Selenium WebDriver with Chrome and ChromeDriver.The fixtures set up and clean up the ChromeDriver instance."""import pytestfrom selenium.webdriver import Chromefrom selenium.webdriver.common.keys import Keys@pytest.fixturedef browser(): # Initialize ChromeDriver driver = Chrome() # Wait implicitly for elements to be ready before attempting interactions driver.implicitly_wait(10) # Return the driver object at the end of setup yield driver # For cleanup, quit the driver driver.quit()def test_basic_duckduckgo_search(browser): # Set up some test case data URL = 'https://www.' PHRASE = 'panda' # Navigate to the DuckDuckGo home page browser.get(URL) # Find the search input element # In the DOM, it has an 'id' attribute of 'search_form_input_homepage' search_input = browser.find_element_by_id('search_form_input_homepage') # Send a search phrase to the input and hit the RETURN key search_input.send_keys(PHRASE + Keys.RETURN) # Verify that results appear on the results page link_divs = browser.find_elements_by_css_selector('#links > div') assert len(link_divs) > 0 # Verify that at least one search result contains the search phrase xpath = f"http://div[@id='links']//*[contains(text(), '{PHRASE}')]" phrase_results = browser.find_elements_by_xpath(xpath) assert len(phrase_results) > 0 # Verify that the search phrase is the same search_input = browser.find_element_by_id('search_form_input') assert search_input.get_attribute('value') == PHRASE

現(xiàn)在,運(yùn)行測(cè)試以確保它可以運(yùn)行:

$ pipenv run python -m pytest============================= test session starts ==============================platform darwin -- Python 3.7.3, pytest-4.5.0, py-1.8.0, pluggy-0.12.0rootdir: /Users/andylpk247/Programming/automation-panda/python-webui-testingcollected 9 items tests/test_math.py ........ [ 88%]tests/test_web.py . [100%]=========================== 9 passed in 6.10 seconds ===========================

網(wǎng)絡(luò)測(cè)試運(yùn)行時(shí),它將打開Google Chrome。您可以觀看它自動(dòng)輸入搜索短語,等待結(jié)果頁面,然后退出瀏覽器。整齊!

如果測(cè)試無法運(yùn)行,請(qǐng)檢查以下內(nèi)容:

  • 測(cè)試計(jì)算機(jī)是否已安裝Chrome?

  • ChromeDriver是否在系統(tǒng)路徑上?

  • ChromeDriver版本與Chrome版本匹配嗎?

  • 是否有文件系統(tǒng)權(quán)限問題?

  • 防火墻是否阻止了任何端口?

  • 測(cè)試代碼正確嗎?

使用Python和Chrome安裝Selenium WebDriver
使用Pytest創(chuàng)建一個(gè)Python測(cè)試自動(dòng)化項(xiàng)目
Selenium Firefox驅(qū)動(dòng)程序:使用Firefox瀏覽器自動(dòng)進(jìn)行測(cè)試
WebDriverIO教程:處理Selenium中的警報(bào)和覆蓋
TeamCity VS Jenkins:選擇正確的CI / CD工具
如何在Selenium WebDriver中處理Web表?


    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多