国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁(yè) > news >正文

倒閉漢化組的wordpress網(wǎng)絡(luò)優(yōu)化工具app手機(jī)版

倒閉漢化組的wordpress,網(wǎng)絡(luò)優(yōu)化工具app手機(jī)版,網(wǎng)店推廣的目的是什么,最好的域名注冊(cè)網(wǎng)站本篇是根據(jù)學(xué)習(xí)網(wǎng)站和網(wǎng)課結(jié)合自己做的學(xué)習(xí)筆記,后續(xù)會(huì)一邊學(xué)習(xí)一邊補(bǔ)齊和整理筆記 非常推薦白月黑羽的學(xué)習(xí)網(wǎng)站: 白月黑羽 (byhy.net) https://selenium-python.readthedocs.io/getting-started.html#simple-usage WEB UI自動(dòng)化環(huán)境配置 (推薦靠譜…

本篇是根據(jù)學(xué)習(xí)網(wǎng)站和網(wǎng)課結(jié)合自己做的學(xué)習(xí)筆記,后續(xù)會(huì)一邊學(xué)習(xí)一邊補(bǔ)齊和整理筆記

非常推薦白月黑羽的學(xué)習(xí)網(wǎng)站:

白月黑羽 (byhy.net)

https://selenium-python.readthedocs.io/getting-started.html#simple-usage

WEB UI自動(dòng)化環(huán)境配置

(推薦靠譜的博客文章來(lái)進(jìn)行環(huán)境配置,具體的我就不寫了)

下載和安裝 Python+下載和安裝 PyCharm+安裝 Selenium 庫(kù)+下載瀏覽器驅(qū)動(dòng)程序:

具體操作還得是看這兩篇文章:

Selenium web UI自動(dòng)化測(cè)試簡(jiǎn)介與環(huán)境搭建_selenium webui-CSDN博客

PyCharm 搭建 Selenium + Python 的自動(dòng)化測(cè)試環(huán)境_pycharm自動(dòng)化測(cè)試-CSDN博客

然后安裝selenium的時(shí)候出現(xiàn)了安裝不成功的問(wèn)題,那就參考這篇文章:

安裝selenium(超級(jí)詳細(xì))_selenium安裝-CSDN博客

Chorme Driver安裝鏈接在這,非常全了:

Chrome for Testing availability (googlechromelabs.github.io)

Anaconda安裝教程參考這篇很實(shí)用:

Anaconda安裝教程傻瓜教程_anaconda下沒(méi)有usr目錄-CSDN博客

遇到的問(wèn)題及解決方法:

下載的谷歌瀏覽器驅(qū)動(dòng)版本和selenium版本一致,但新版本selenium瀏覽器總是會(huì)退,解決方法:

在最后加個(gè)input()等待

選擇元素的基本方法

find_element 和 find_elements 的區(qū)別

使用?find_elements?選擇的是符合條件的?所有?元素, 如果沒(méi)有符合條件的元素,?返回空列表

使用?find_element?選擇的是符合條件的?第一個(gè)?元素, 如果沒(méi)有符合條件的元素,?拋出 NoSuchElementException 異常

通過(guò)WebElement對(duì)象選擇元素

WebDriver 對(duì)象 選擇元素的范圍是 整個(gè) web頁(yè)面

WebElement 對(duì)象 選擇元素的范圍是 該元素的內(nèi)部

定位元素

eg:拿測(cè)試百度網(wǎng)頁(yè)來(lái)看:

?通過(guò)ID定位

在網(wǎng)頁(yè)上通過(guò)?ID?定位一個(gè)元素(通常是一個(gè)輸入框),然后向這個(gè)輸入框中輸入?"Selenium",最后打印出這個(gè)輸入框的當(dāng)前值。

# 1. By ID - 定位搜索輸入框search_box_by_id = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "kw")))search_box_by_id.send_keys("Selenium") ?# 在輸入框中輸入"Selenium"print("Located by ID:", search_box_by_id.get_attribute("value"))
  1. WebDriverWait(driver, 10):

    • 這個(gè)部分表示對(duì)?driver(Selenium 的瀏覽器控制對(duì)象)進(jìn)行最多?10秒?的等待時(shí)間。Selenium 中有隱式和顯式等待,此處使用的是顯式等待即在指定時(shí)間內(nèi)等待某個(gè)條件滿足。
  2. until(EC.presence_of_element_located((By.ID, "kw"))):

    • until?方法的作用是在指定的條件被滿足前一直等待,或者直到超時(shí)。這里的條件是EC.presence_of_element_located,它會(huì)等待頁(yè)面上某個(gè)元素(通過(guò)指定的定位方法,如ID)被找到并存在。
    • (By.ID, "kw")?表示通過(guò)?ID?屬性定位頁(yè)面上的元素,ID 的值是?"kw"。這個(gè)ID通常用于唯一標(biāo)識(shí)頁(yè)面中的某個(gè)元素。
  3. search_box_by_id.send_keys("Selenium"):

    • send_keys?方法用于在找到的輸入框中模擬鍵盤輸入。這里它向頁(yè)面上的搜索框輸入了?"Selenium"?這個(gè)字符串。
  4. print("Located by ID:", search_box_by_id.get_attribute("value")):

    • get_attribute("value")?是獲取輸入框當(dāng)前的值。它會(huì)打印出輸入框中已經(jīng)填入的內(nèi)容,以確認(rèn)?"Selenium"?已經(jīng)正確輸入。

?按名稱定位?

通過(guò)?Name?或?ID?屬性定位頁(yè)面上的搜索按鈕(最終是通過(guò)?ID?"su"?定位),并模擬點(diǎn)擊操作。

 ? # 2. By Name - 定位搜索按鈕# 定位搜索按鈕(名稱為wd),并點(diǎn)擊按鈕(百度按鈕的ID實(shí)際為su,所以切換成用ID定位)。search_button_by_name = driver.find_element(By.NAME, "wd")search_button_by_name = driver.find_element(By.ID, "su") ?# 百度搜索按鈕的ID為 "su"search_button_by_name.click()print("Located by Name: 搜索按鈕點(diǎn)擊成功")
  1. search_button_by_name = driver.find_element(By.NAME, "wd"):

    • 嘗試通過(guò)按鈕的?Name?屬性來(lái)定位搜索按鈕。find_element(By.NAME, "wd")?意思是尋找網(wǎng)頁(yè)中?name?屬性為?"wd"?的元素。但百度的搜索按鈕并沒(méi)有這個(gè)?name?屬性,因此這段代碼應(yīng)該是示例中的注釋部分,可能是最初的嘗試。
  2. search_button_by_name = driver.find_element(By.ID, "su"):

    • 由于百度的搜索按鈕的實(shí)際ID為?"su",所以在這里使用?ID?來(lái)重新定位元素。find_element(By.ID, "su")?表示通過(guò)元素的?ID(即?"su")來(lái)找到這個(gè)元素。
  3. search_button_by_name.click():

    • click()?方法用于模擬用戶點(diǎn)擊該按鈕。這意味著一旦找到搜索按鈕,Selenium 將自動(dòng)執(zhí)行點(diǎn)擊操作,觸發(fā)搜索功能。

按類名查找元素

輸出該元素的?class?屬性值,以確認(rèn)定位是否正確。

 # 3. By Class Name - 定位搜索輸入框的父級(jí)容器parent_div_by_class_name = driver.find_element(By.CLASS_NAME, "s_form")print("Located by Class Name:", parent_div_by_class_name.get_attribute("class"))

Class Name?是 HTML 元素的一個(gè)屬性,用于標(biāo)識(shí)多個(gè)元素共享的樣式或功能,因此使用?Class Name?可以選擇某些具有相同特征的元素。

按標(biāo)簽名稱定位元素?

輸出找到的鏈接數(shù)量,方便確認(rèn)是否正確定位了頁(yè)面上的所有鏈接。

? ? # 4. By Tag Name - 定位所有鏈接all_links_by_tag_name = driver.find_elements(By.TAG_NAME, "a")print(f"Located by Tag Name: 找到 {len(all_links_by_tag_name)} 個(gè)鏈接")
  1. all_links_by_tag_name = driver.find_elements(By.TAG_NAME, "a"):

    • 這行代碼通過(guò)?TAG_NAME?定位頁(yè)面中的所有?<a>?標(biāo)簽。find_elements(By.TAG_NAME, "a")?方法會(huì)返回一個(gè)包含所有鏈接元素的列表(每個(gè)鏈接都是由?<a>?標(biāo)簽定義的)。
    • 這里的?find_elements?返回多個(gè)元素,因此用?find_elements?而不是?find_element。即使頁(yè)面上有多個(gè)?<a>?標(biāo)簽,它也可以找到并返回所有的鏈接元素。
  2. print(f"Located by Tag Name: 找到 {len(all_links_by_tag_name)} 個(gè)鏈接"):

    • len(all_links_by_tag_name)?獲取?all_links_by_tag_name?列表的長(zhǎng)度,也就是找到的?<a>?標(biāo)簽的數(shù)量。
    • 使用?f-string?格式化輸出信息,將找到的鏈接數(shù)量插入到打印語(yǔ)句中,向用戶反饋已經(jīng)定位到多少個(gè)鏈接。

通過(guò) XPath 定位

  • 通過(guò)?XPath?精確定位頁(yè)面中的百度新聞鏈接,確保鏈接的?href?和?class?屬性滿足指定條件。
  • 使用?顯式等待?確保在指定的時(shí)間內(nèi),等待元素的加載,適應(yīng)動(dòng)態(tài)網(wǎng)頁(yè)。
? # 5.使用XPath來(lái)進(jìn)行定位元素 定位新聞# CSSSelector中的href屬性值需要使用引號(hào)包圍news_link_by_xpath = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//a[@href='http://news.baidu.com' and @class='mnav c-font-normal c-color-t']")))
  1. WebDriverWait(driver, 20).until(...):

    • WebDriverWait?是?Selenium?提供的顯式等待方法,用于等待某個(gè)條件成立。在這里,我們告訴?Selenium?最多等待 20 秒,直到元素被定位并可用為止。
    • 顯式等待?是在特定條件下使用的,它可以等待某個(gè)元素出現(xiàn)或某個(gè)狀態(tài)完成,適用于動(dòng)態(tài)加載的頁(yè)面。
  2. EC.presence_of_element_located(...):

    • EC?是?expected_conditions?的縮寫。presence_of_element_located?表示等待某個(gè)元素在 DOM 中存在,但不一定可見(jiàn)。這里通過(guò)?XPath?指定我們要尋找的元素。
  3. By.XPATH?和 XPath 表達(dá)式:

    • By.XPATH?指定使用?XPath?定位元素。XPath?是一種用于查找 XML 或 HTML 文檔中特定元素的路徑語(yǔ)言,特別適合用于復(fù)雜結(jié)構(gòu)或需要多條件篩選的情況。
    • "//a[@href='http://news.baidu.com' and @class='mnav c-font-normal c-color-t']"
      • //a:表示在整個(gè)頁(yè)面中查找?<a>?標(biāo)簽(鏈接元素)。
      • [@href='http://news.baidu.com']:指定?href?屬性值必須是?"http://news.baidu.com",也就是指向百度新聞的鏈接。
      • [@class='mnav c-font-normal c-color-t']:指定?class?屬性必須為?'mnav c-font-normal c-color-t',確保只選擇特定樣式的鏈接。

通過(guò)鏈接文本查找超鏈接?

  • 通過(guò)部分鏈接文本定位包含“視頻”一詞的鏈接,并打印出該鏈接的完整文本。
  • 適合用于無(wú)法預(yù)知鏈接的完整文本,但知道部分文本的場(chǎng)景。
? ? # 6. By Partial Link Text - 定位部分文本包含"視頻"的鏈接video_link_by_partial_link_text = driver.find_element(By.PARTIAL_LINK_TEXT, "視頻")print("Located by Partial Link Text:", video_link_by_partial_link_text.text)
  1. driver.find_element(By.PARTIAL_LINK_TEXT, "視頻"):

    • 這個(gè)方法使用?Partial Link Text?定位頁(yè)面中的鏈接。By.PARTIAL_LINK_TEXT?允許通過(guò)部分鏈接文本進(jìn)行定位,而不要求完整匹配鏈接文本。
    • 這里尋找的是文本部分包含?“視頻”?的鏈接(<a>?標(biāo)簽)。它只需要鏈接文本中含有 “視頻” 這兩個(gè)字,就可以定位到對(duì)應(yīng)的元素。
    • find_element?方法返回頁(yè)面中第一個(gè)匹配的元素對(duì)象。
  2. video_link_by_partial_link_text.text:

    • text?屬性用于獲取找到的鏈接元素的可見(jiàn)文本。在這個(gè)例子中,video_link_by_partial_link_text.text?會(huì)返回鏈接的完整文本內(nèi)容。

?通過(guò) CSS 選擇器定位元素

? # 7. By CSS Selector - 定位百度logologo_by_css_selector = driver.find_element(By.CSS_SELECTOR, "#lg > img")print("Located by CSS Selector: 百度Logo已找到")
  1. driver.find_element(By.CSS_SELECTOR, "#lg > img"):

    • 這行代碼通過(guò)?CSS Selector?定位元素,使用的是?find_element?方法,它會(huì)返回頁(yè)面中第一個(gè)符合條件的元素。
    • CSS Selector?是一種靈活且強(qiáng)大的方式,允許我們通過(guò)?CSS?規(guī)則定位元素。它支持多種選擇器類型,包括 ID、類、標(biāo)簽、屬性等。
    • 在這個(gè)例子中,#lg > img?表示選擇 ID 為?lg?的元素下的?img?標(biāo)簽:
      • #lg:表示一個(gè) ID 為?lg?的元素(ID 選擇器)。
      • >:表示選擇其直接子元素。
      • img:表示一個(gè)?img?標(biāo)簽(圖像元素)。
    • 結(jié)合起來(lái),這個(gè)選擇器用于選擇 ID 為?lg?的元素內(nèi)的?img?元素(通常是百度主頁(yè)上的?Logo?圖片)。

總體代碼如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 初始化 WebDriver
service = Service(executable_path="D:/Apython/chromedriver.exe")
driver = webdriver.Chrome(service=service)# 打開(kāi)百度主頁(yè)
driver.get('https://www.baidu.com')try:# 1. By ID - 定位搜索輸入框search_box_by_id = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "kw")))search_box_by_id.send_keys("Selenium")  # 在輸入框中輸入"Selenium"print("Located by ID:", search_box_by_id.get_attribute("value"))# 2. By Name - 定位搜索按鈕# 定位搜索按鈕(名稱為wd),并點(diǎn)擊按鈕(百度按鈕的ID實(shí)際為su,所以切換成用ID定位)。search_button_by_name = driver.find_element(By.NAME, "wd")search_button_by_name = driver.find_element(By.ID, "su")  # 百度搜索按鈕的ID為 "su"search_button_by_name.click()print("Located by Name: 搜索按鈕點(diǎn)擊成功")# 3. By Class Name - 定位搜索輸入框的父級(jí)容器parent_div_by_class_name = driver.find_element(By.CLASS_NAME, "s_form")print("Located by Class Name:", parent_div_by_class_name.get_attribute("class"))# 4. By Tag Name - 定位所有鏈接all_links_by_tag_name = driver.find_elements(By.TAG_NAME, "a")print(f"Located by Tag Name: 找到 {len(all_links_by_tag_name)} 個(gè)鏈接")# 5.使用XPath來(lái)進(jìn)行定位元素 定位新聞# CSSSelector中的href屬性值需要使用引號(hào)包圍news_link_by_xpath = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//a[@href='http://news.baidu.com' and @class='mnav c-font-normal c-color-t']")))# 6. By Partial Link Text - 定位部分文本包含"視頻"的鏈接video_link_by_partial_link_text = driver.find_element(By.PARTIAL_LINK_TEXT, "視頻")print("Located by Partial Link Text:", video_link_by_partial_link_text.text)# 7. By CSS Selector - 定位百度logologo_by_css_selector = driver.find_element(By.CSS_SELECTOR, "#lg > img")print("Located by CSS Selector: 百度Logo已找到")# 8. By XPath - 定位搜索輸入框search_box_by_xpath = driver.find_element(By.XPATH, "//input[@id='kw']")search_box_by_xpath.clear()  # 清空輸入框內(nèi)容search_box_by_xpath.send_keys("XPath 選擇器")  # 再次輸入print("Located by XPath:", search_box_by_xpath.get_attribute("value"))except Exception as e:print("An error occurred:", str(e))finally:# 關(guān)閉瀏覽器driver.quit()

元素操作

清除文本輸入框

clear(self)

點(diǎn)擊元素

click(self)

提交表單

submit(self)

發(fā)送信息

send_keys(self, *value)

WebElement 中常見(jiàn)的元素屬性

獲取元素屬性

get_attribute(self, name)

判斷元素可見(jiàn)

is_displayed(self)

判斷元素可用

is_enabled(self)

判斷元素是否被選中

is_selected(self)

WebElement 中常見(jiàn)的屬性方法

獲取元素位置

location

獲取元素大小

size

獲取元素的文本

text

設(shè)計(jì)模式(封裝)

Pom模式+關(guān)鍵字驅(qū)動(dòng)模式
po模式:page object model 頁(yè)面對(duì)象模式。
好處:
解決:線性腳本的問(wèn)題
解決:代碼不能重復(fù)利用的問(wèn)題
解決:后期的維護(hù)問(wèn)題
票子:看過(guò)他們的倉(cāng)庫(kù)?日用品放一起,電器放一起,文具放一起
..分類
分三層 :
1.基礎(chǔ)層:base 主要放selenium原生的方法,
2.頁(yè)面對(duì)象層:po?主要用于放頁(yè)面的元素和頁(yè)面的動(dòng)作。
3.測(cè)試用例層:testcase 存放測(cè)試用例以及測(cè)試數(shù)據(jù),
頁(yè)面對(duì)象層調(diào)用基礎(chǔ)層的方法,測(cè)試用例層調(diào)用頁(yè)面對(duì)象層的方法。

瀏覽器導(dǎo)航操作

等待界面元素出現(xiàn)

等待頁(yè)面加載完成

Selenium Webdriver 提供兩種類型的waits - 隱式和顯式。 顯式等待會(huì)讓W(xué)ebDriver等待滿足一定的條件以后再進(jìn)一步的執(zhí)行。 而隱式等待讓W(xué)ebdriver等待一定的時(shí)間后再才是查找某元素。

在我們進(jìn)行網(wǎng)頁(yè)操作的時(shí)候, 有的元素內(nèi)容不是可以立即出現(xiàn)的, 可能會(huì)等待一段時(shí)間。

比如 我們的股票搜索示例頁(yè)面, 搜索一個(gè)股票名稱, 我們點(diǎn)擊搜索后, 瀏覽器需要把這個(gè)搜索請(qǐng)求發(fā)送給服務(wù)器, 服務(wù)器進(jìn)行處理后,再把搜索結(jié)果返回給我們。

所以,從點(diǎn)擊搜索到得到結(jié)果,需要一定的時(shí)間,

只是通常 服務(wù)器的處理比較快,我們感覺(jué)好像是立即出現(xiàn)了搜索結(jié)果。

搜索的每個(gè)結(jié)果 對(duì)應(yīng)的界面元素 其ID 分別是數(shù)字 1, 2 ,3, 4 。。。

我們可以先用如下代碼 將 第一個(gè)搜索結(jié)果里面的文本內(nèi)容 打印出來(lái)

為什么呢?

因?yàn)槲覀兊拇a執(zhí)行的速度比 網(wǎng)站響應(yīng)的速度 快。

網(wǎng)站還沒(méi)有來(lái)得及 返回搜索結(jié)果,我們就執(zhí)行了如下代碼

element = wd.find_element(By.ID, '1')

在那短暫的瞬間, 網(wǎng)頁(yè)上是沒(méi)有用 id為1的元素的 (因?yàn)檫€沒(méi)有搜索結(jié)果呢)。自然就會(huì)報(bào)告錯(cuò)誤 id為1 的元素不存在了。

那么怎么解決這個(gè)問(wèn)題呢?

from selenium import webdriver
from selenium.webdriver.common.by import By# 創(chuàng)建 WebDriver 對(duì)象
wd = webdriver.Chrome()
"""
后續(xù)所有的 find_element 或者 find_elements 之類的方法調(diào)用 都會(huì)采用上面的策略:
如果找不到元素, 每隔 半秒鐘 再去界面上查看一次, 直到找到該元素, 或者 過(guò)了10秒 最大時(shí)長(zhǎng)
"""
# 隱式等待  以后創(chuàng)建 WebDriver 對(duì)象之后,都要條件反射的加上這個(gè)隱式等待
wd.implicitly_wait(10)try:# 調(diào)用WebDriver 對(duì)象的get方法 可以讓瀏覽器打開(kāi)指定網(wǎng)址wd.get('https://www.byhy.net/cdn2/files/selenium/stock1.html')# 根據(jù)id選擇元素,返回的就是該元素對(duì)應(yīng)的WebElement對(duì)象element = wd.find_element(By.ID, 'kw')# 通過(guò)該 WebElement對(duì)象,就可以對(duì)頁(yè)面元素進(jìn)行操作了# 比如輸入字符串到 這個(gè) 輸入框里element.send_keys('通訊\n')# 等待用戶輸入,以便觀察當(dāng)前頁(yè)面狀態(tài)input("按下任意鍵繼續(xù)...")element = wd.find_element(By.ID,'go')element.click()#讓這個(gè)代碼執(zhí)行不要那么塊 網(wǎng)站響應(yīng)的速度相對(duì)較慢# import time#問(wèn)題是這里設(shè)置多長(zhǎng)時(shí)間合適呢"""解決方法:當(dāng)發(fā)現(xiàn)元素沒(méi)有找到的時(shí)候,并不立即返回 找不到的 元素的錯(cuò)誤而是周期(每隔半秒)重新尋找元素 直到元素找到或者超出指定最大等待時(shí)長(zhǎng),這時(shí)才 拋出異常(如果是 find_elements 之類的方法, 則是返回空列表)。"""# while True:#     try:#         # 網(wǎng)站還沒(méi)有來(lái)得及 返回搜索結(jié)果,我們就執(zhí)行了如下代碼#         element = wd.find_element(By.ID, '1')#         print(element.text)#         break#     except:#         time.sleep(1)"""但這樣會(huì)出現(xiàn)死循環(huán),這里要用implicitly_wait ,隱式等待 ,或者 全局等待 。該方法接受一個(gè)參數(shù),用來(lái)指定 最大等待 時(shí)長(zhǎng)"""element = wd.find_element(By.ID, '1')print(element.text)finally:# 關(guān)閉瀏覽器wd.quit()

顯式等待

在代碼中定義等待一定條件發(fā)生后再進(jìn)一步執(zhí)行代碼。

最糟糕的案例是使用time.sleep(),它將條件設(shè)置為等待一個(gè)確切的時(shí)間段。 這里有一些方便的方法讓你只等待需要的時(shí)間。WebDriverWait結(jié)合ExpectedCondition 是實(shí)現(xiàn)的一種方式。

隱式等待

如果某些元素不是立即可用的,隱式等待是告訴WebDriver去等待一定的時(shí)間后去查找元素。 默認(rèn)等待時(shí)間是0秒,一旦設(shè)置該值,隱式等待是設(shè)置該WebDriver的實(shí)例的生命周期。

eg,拿百度首頁(yè)先在輸入框輸入Selenium之后,等待一會(huì)兒在跳轉(zhuǎn)視頻模塊進(jìn)行舉例

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
import time# 自定義等待類:等待元素具有特定的CSS類
class element_has_css_class(object):def __init__(self, locator, css_class):self.locator = locatorself.css_class = css_classdef __call__(self, driver):element = driver.find_element(*self.locator)if self.css_class in element.get_attribute("class"):return elementelse:return False# 初始化Chrome WebDriver
driver = webdriver.Chrome()try:# 訪問(wèn)百度首頁(yè)driver.get("https://www.baidu.com")# 等待百度首頁(yè)的搜索框加載并可點(diǎn)擊search_box = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "kw")))print("搜索框已加載并可點(diǎn)擊")# 在搜索框中輸入關(guān)鍵詞并提交search_box.send_keys("Selenium")search_box.submit()# 等待搜索結(jié)果頁(yè)面加載,并等待搜索結(jié)果元素加載完成WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "content_left")))print("搜索結(jié)果頁(yè)面已加載")# 通過(guò)CSS類檢查搜索按鈕是否加載完成并可點(diǎn)擊# 使用自定的element_has_css_class  等待搜素按鈕具備特定的CSS類  確保樣式正確search_button = WebDriverWait(driver, 10).until(element_has_css_class((By.ID, "su"), "bg s_btn"))print("搜索按鈕具備指定的CSS類")# 點(diǎn)擊“新聞”鏈接,使用CSS Selector定位news_link = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT,"視頻")))news_link.click()print("已點(diǎn)擊視頻鏈接")# 等待新聞頁(yè)面加載完成WebDriverWait(driver, 10).until(EC.title_contains("百度新聞"))print("百度新聞頁(yè)面已加載")# 等待某個(gè)新聞板塊可見(jiàn)news_section = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".news-nav-item")))print("新聞板塊已加載")# 進(jìn)一步操作,如點(diǎn)擊具體的新聞標(biāo)題等f(wàn)inally:# 等待幾秒后關(guān)閉瀏覽器time.sleep(20)driver.quit()

eg,獲取百度頁(yè)面的 title 和 URL,并使用句柄方式切換窗口的例子:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import time# 創(chuàng)建一個(gè) WebDriver 實(shí)例
driver = webdriver.Chrome()# 打開(kāi)百度首頁(yè)
driver.get("http://www.baidu.com")# 獲取當(dāng)前窗口的句柄
current_window_handle = driver.current_window_handle# 獲取當(dāng)前窗口的 title 和 URL
print("當(dāng)前窗口的 title:", driver.title)
print("當(dāng)前窗口的 URL:", driver.current_url)# 點(diǎn)擊百度首頁(yè)上的 "新聞" 鏈接,打開(kāi)一個(gè)新窗口
driver.find_element(By.LINK_TEXT, "新聞").click()# 等待 2 秒,確保新窗口已經(jīng)打開(kāi)
time.sleep(2)# 獲取所有窗口的句柄
all_window_handles = driver.window_handles# 遍歷所有窗口的句柄
for window_handle in all_window_handles:# 如果當(dāng)前窗口的句柄不是第一個(gè)窗口的句柄if window_handle != current_window_handle:# 切換到當(dāng)前窗口driver.switch_to.window(window_handle)# 獲取當(dāng)前窗口的 title 和 URLprint("當(dāng)前窗口的 title:", driver.title)print("當(dāng)前窗口的 URL:", driver.current_url)# 關(guān)閉所有窗口
driver.quit()

頁(yè)面對(duì)象

一個(gè)頁(yè)面對(duì)象表示在你測(cè)試的WEB應(yīng)用程序的用戶界面上的區(qū)域。

使用頁(yè)面對(duì)象模式的好處:

  • 創(chuàng)建可復(fù)用的代碼以便于在多個(gè)測(cè)試用例間共享
  • 減少重復(fù)的代碼量
  • 如果用戶界面變化,只需要修改一處

項(xiàng)目目錄結(jié)構(gòu):

pythonProject/

├── po/

│ ├── __init__.py # 初始化文件

│ ├── element.py # 頁(yè)面元素封裝

│ └── page.py # 頁(yè)面對(duì)象類定義

├── tests/

│ ├── __init__.py # 初始化文件

│ └── test_search.py # 測(cè)試用例

└── requirements.txt # 依賴文件

?eg1:要自動(dòng)化測(cè)試 Python 官方網(wǎng)站的搜索功能。具體步驟如下:

打開(kāi) Python 官網(wǎng)。

輸入搜索關(guān)鍵字,例如 "pycon"。

點(diǎn)擊搜索按鈕。

驗(yàn)證搜索結(jié)果頁(yè)面是否正確加載。

頁(yè)面元素

po/element.py?中定義頁(yè)面元素封裝類

# 頁(yè)面元素封裝 包含基本的操作方法 例如查找元素、點(diǎn)擊、發(fā)送文本等。
# 定位元素
from selenium.webdriver.common.by import By
# 處理頁(yè)面加載時(shí)間不確定的情況,確保在操作元素之前它已經(jīng)存在或可見(jiàn)。
from selenium.webdriver.support.ui import WebDriverWait
# expected_conditions (EC): 一個(gè)預(yù)定義的條件集,可以結(jié)合 WebDriverWait 使用。
# 例如,等待某個(gè)元素出現(xiàn)、可點(diǎn)擊、頁(yè)面標(biāo)題包含某些內(nèi)容等。
from selenium.webdriver.support import expected_conditions as EC# 封裝了對(duì)頁(yè)面元素的基本操作 查找 點(diǎn)擊和輸入文本
class BaseElement:def __init__(self, driver, by, value):# 與瀏覽器的交互self.driver = driver# 元素的定位方式self.by = by# 元素的定位值self.value = valuedef find_element(self):# 等待最多10秒鐘,直到滿足條件。如果 10# 秒內(nèi)條件未滿足,會(huì)拋出超時(shí)異常。return WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((self.by, self.value)))# 通過(guò)find_element方法找到元素,然后執(zhí)行點(diǎn)擊操作。def click(self):self.find_element().click()# 向頁(yè)面上的輸入框元素發(fā)送文本(例如輸入搜索關(guān)鍵詞)def send_keys(self, text):# 先通過(guò)find_element方法找到元素,然后將文本text輸入到該元素中。self.find_element().send_keys(text)

頁(yè)面對(duì)象類

po/page.py?中創(chuàng)建頁(yè)面對(duì)象類

# 頁(yè)面對(duì)象類定義 代表 Python 官網(wǎng)的首頁(yè)以及搜索結(jié)果頁(yè)面。
from po.element import BaseElement
from selenium.webdriver.common.by import By# 封裝了主頁(yè)上的操作:輸入搜索關(guān)鍵詞和點(diǎn)擊搜索按鈕。
class PythonOrgHomePage:def __init__(self, driver):self.driver = driver# search_box和go_button:這兩個(gè)是定位器,用于定位主頁(yè)上的搜索框和搜索按鈕。# BaseElement類封裝了元素的查找和操作邏輯,By.NAME, "q"和By.ID, "submit"指定了如何定位這些元素。self.search_box = BaseElement(driver, By.NAME, "q")self.go_button = BaseElement(driver, By.ID, "submit")# 用于在搜索框中輸入搜索詞。 term: 要輸入的搜索關(guān)鍵詞。def enter_search_term(self, term):self.search_box.send_keys(term)# term: 要輸入的搜索關(guān)鍵詞。找到搜索按鈕并執(zhí)行點(diǎn)擊操作。def click_go_button(self):self.go_button.click()# 封裝了搜索結(jié)果頁(yè)面的驗(yàn)證邏輯。通過(guò)檢查頁(yè)面標(biāo)題,它可以確定搜索是否成功。
class SearchResultsPage:def __init__(self, driver):self.driver = driverdef is_result_found(self):print("Current page title:", self.driver.title)return "Search Python.org" in self.driver.title

測(cè)試用例

?tests/test_search.py?中編寫測(cè)試用例

# 測(cè)試用例
import unittest
from selenium import webdriver
from po.page import PythonOrgHomePage, SearchResultsPageclass PythonOrgSearchTest(unittest.TestCase):# 在每個(gè)測(cè)試用例執(zhí)行之前調(diào)用,用于初始化測(cè)試環(huán)境。def setUp(self):self.driver = webdriver.Chrome()  # 使用 Chrome 瀏覽器self.driver.get("https://www.python.org")def test_search_in_python_org(self):# 創(chuàng)建一個(gè) PythonOrgHomePage實(shí)例,封裝了主頁(yè)上的操作。home_page = PythonOrgHomePage(self.driver)# 在搜索框中輸入"pycon"home_page.enter_search_term("pycon")# 點(diǎn)擊搜索按鈕home_page.click_go_button()# 封裝了搜索結(jié)果頁(yè)面的操作。search_results_page = SearchResultsPage(self.driver)self.assertTrue(search_results_page.is_result_found())# 每個(gè)測(cè)試用例執(zhí)行之后調(diào)用,用于清理測(cè)試環(huán)境。def tearDown(self):self.driver.quit()if __name__ == "__main__":unittest.main()

eg2,使用 Selenium WebDriver 和 unittest 框架,測(cè)試百度搜索功能

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECclass BaiduHomePage:def __init__(self, driver):self.driver = driver# 元組,用于指定搜索框和搜索按鈕的定位方式(ID)。self.search_box = (By.ID, "kw")self.search_button = (By.ID, "su")# 在搜索框中輸入搜索詞# 等待搜索框出現(xiàn)# 超時(shí)時(shí)間為10s# 向搜索框中輸入搜索詞def enter_search_term(self, term):WebDriverWait(self.driver, 10).until(EC.presence_of_element_located(self.search_box)).send_keys(term)# 點(diǎn)擊搜索按鈕# 等待搜索按鈕可點(diǎn)擊,超時(shí)時(shí)間為 10 秒# 等待條件,元素可點(diǎn)擊# 點(diǎn)擊搜索按鈕def click_search_button(self):WebDriverWait(self.driver, 10).until(EC.element_to_be_clickable(self.search_button)).click()class BaiduSearchResultsPage:def __init__(self, driver):self.driver = driver# 用于檢查搜索結(jié)果頁(yè)面是否正確加載def is_result_found(self):return "百度一下,你就知道" in self.driver.title

test_baidu_search.py(測(cè)試用例)

import unittest
from selenium import webdriver
from page import BaiduHomePage, BaiduSearchResultsPageclass TestBaiduSearch(unittest.TestCase):# 在每個(gè)測(cè)試用例執(zhí)行前執(zhí)行一次,用于初始化測(cè)試環(huán)境。def setUp(self):self.driver = webdriver.Chrome()self.driver.get("https://www.baidu.com")def test_baidu_search(self):home_page = BaiduHomePage(self.driver)home_page.enter_search_term("Python")home_page.click_search_button()search_results_page = BaiduSearchResultsPage(self.driver)self.assertTrue(search_results_page.is_result_found())def tearDown(self):self.driver.quit()if __name__ == "__main__":unittest.main()


?

http://m.aloenet.com.cn/news/32238.html

相關(guān)文章:

  • 找合伙人做紅木家具網(wǎng)站廈門seo百度快照優(yōu)化
  • 網(wǎng)頁(yè)設(shè)計(jì)軟件app百度seo入駐
  • 做網(wǎng)站v1認(rèn)證需要付費(fèi)嗎seo外包服務(wù)公司
  • 電影網(wǎng)站app怎么做的怎么創(chuàng)建自己的免費(fèi)網(wǎng)址
  • 優(yōu)化網(wǎng)站的網(wǎng)站seo快速優(yōu)化排名
  • 深圳效果好的免費(fèi)網(wǎng)站建設(shè)seo知識(shí)總結(jié)
  • 邢臺(tái)路橋建設(shè)總公司沒(méi)有網(wǎng)站嗎做優(yōu)化的網(wǎng)站
  • 常德網(wǎng)站制作sem推廣是什么意思呢
  • ui參考網(wǎng)站網(wǎng)站優(yōu)化排名金蘋果下拉
  • mobile網(wǎng)站開(kāi)發(fā)百度大搜推廣開(kāi)戶
  • 如何在aws上創(chuàng)建wordpress北京seo公司助力網(wǎng)絡(luò)營(yíng)銷
  • 襄陽(yáng)營(yíng)銷型網(wǎng)站建設(shè)網(wǎng)站排名優(yōu)化外包
  • 網(wǎng)站建設(shè)糾紛怎么投訴自己怎樣開(kāi)網(wǎng)站
  • wordpress博客xiu北京seo供應(yīng)商
  • asp.net 旅游網(wǎng)站開(kāi)發(fā)淘寶seo優(yōu)化排名
  • 上海消費(fèi)品網(wǎng)絡(luò)營(yíng)銷推廣公司長(zhǎng)沙seo排名優(yōu)化公司
  • 鮮花網(wǎng)站怎么做寧波seo推廣服務(wù)
  • wordpress 去除頁(yè)面標(biāo)題seo點(diǎn)擊軟件手機(jī)
  • 做健身網(wǎng)站東莞網(wǎng)站制作
  • 色無(wú)極網(wǎng)站正在建設(shè)中seo值是什么意思
  • 網(wǎng)站開(kāi)發(fā)中的抓包工具網(wǎng)站代運(yùn)營(yíng)多少錢一個(gè)月
  • 氣象服務(wù)網(wǎng)站建設(shè)計(jì)算機(jī)培訓(xùn)
  • 網(wǎng)站開(kāi)發(fā)和桌面開(kāi)發(fā)哪個(gè)難百度搜索熱詞查詢
  • 視頻網(wǎng)站開(kāi)發(fā)前景創(chuàng)建網(wǎng)站的流程
  • 東莞建站網(wǎng)站模板站長(zhǎng)查詢工具
  • 做視頻網(wǎng)站需要多少帶寬優(yōu)化網(wǎng)站標(biāo)題名詞解釋
  • 寧波網(wǎng)站建設(shè)論壇日喀則網(wǎng)站seo
  • 德州手機(jī)網(wǎng)站建設(shè)費(fèi)用網(wǎng)絡(luò)推廣的方式有哪些
  • 邯鄲市網(wǎng)絡(luò)建站百度百度一下就知道
  • 我是做性視頻網(wǎng)站懷化seo推廣