? ?當我們可以打開瀏覽器后我們如果想要進行web測試我們自然要對網頁的一些功能進行單獨拿出來進行測試,但是我們要怎么才能拿到我們想要的元素,并且對其進行操作呢。
? ? 我們就以百度主頁的輸入框為例,如果我們想要王輸入框中輸入一些內容我們就需要通過html定位到輸入框的位置。
? ? 通常我們最常用也是最方便的一種方式就是通過id進行元素定位,下面我們來進行實現一些案例,假設我們想要輸入“測試”,我們可以通過下述用例方式:
通過ID定位:
?
import timefrom selenium import webdriver
from selenium.webdriver.common.by import By#打開瀏覽器
driver = webdriver.Chrome()
# driver.implicitly_wait(2)
#進入百度主頁
driver.get("https://www.baidu.com")
#通過id定位輸入框位置
element = driver.find_element(By.ID,'kw')
#輸入元素
element.send_keys("測試")
#Exception managing chrome: error decoding response body
time.sleep(2)
#關閉瀏覽器
driver.close()
? ? ?這里我們通過driver.find_element()這個方法來通過By.ID通過id這個屬性來確定html的位置,當然我們還有其他的方法確定html的位置,查找到html的位置后會返回一個對象WebElement我們通常命名為element是WebElement的實例,這個類是Selenium用來表示html的核心對象,通過這個對象我們可以對網頁上的元素進行各類操作。
? ? ? ?由于我們已經通過ID查找到了html的具體位置,通過send_keys()將想要的內容傳入輸入框。當然我們再輸入“測試”后單擊進行搜索,我們仍然可以通過id定位按鈕的html位置然后進行click()之后就和我們正常用的搜索相同了。?
? 但是需要特別注意的是雖然一般情況下ID是唯一的但是也會出現“意外”,也會有些代碼不遵守這種默認的規則,此時我們就需要利用其他的方式完成我們的目標。
通過By.NAME定位:
? ? 在百度輸入框中我們也可以看到name這個屬性,我們也可以通過name完成上述操作,輸入“測試”。
?
import timefrom selenium import webdriver
from selenium.webdriver.common.by import By#打開瀏覽器
driver = webdriver.Chrome()
# driver.implicitly_wait(2)
#進入百度主頁
driver.get("https://www.baidu.com")
#通過id定位輸入框位置
# element = driver.find_element(By.ID,'kw')
#輸入元素
element = driver.find_element(By.NAME,'wd')element.send_keys("測試")
#Exception managing chrome: error decoding response body
time.sleep(2)
#關閉瀏覽器
driver.close()
?由此可見我們通過name屬性仍然完成了上述操作。
通過TAG_NAME定位:
? 這種定位方式是通過標簽進行定位,我們可以通過這種定位獲取到對應標簽下的所有信息并且我們可以將這些信息進行打印,假如我們要獲取到div標簽下的所有信息,例如:
??
import timefrom selenium import webdriver
from selenium.webdriver.common.by import By
from sqlalchemy.sql.base import elements#打開瀏覽器
driver = webdriver.Chrome()
#進入百度主頁
driver.get("https://www.baidu.com")elements = driver.find_element(By.TAG_NAME,'div')
for element in elements:print(element)#關閉瀏覽器
driver.close()
? 理論上來說。通過這種方式,我們可以獲取到div標簽上的所有信息,但是如果我們運行這段代碼我們會發現不會輸出任何內容,這是因為我們訪問某個網頁時,如果數據還未加載此時我們就使用TAG_NAME定位,由于此時還沒有數據,因此返回值可能是none。但是這種解決的方式也非常簡單,沒時間加載數據那我們就給它時間,我們此處可以使用time.sleep()設置等待的時間,但是我們要注意的是多長時間才算長呢?如果時間過長會造成資源的浪費,時間太短數據加載不完全,因此Selenium給我們提供了一種方式(等待元素),讓我們能解決這個問題,driver.implicitly_wait()方法,這種方式可以設置全局的隱式等待時間,當查找元素時,如果元素未被找到,會不斷地在指定時間進行查找,直到超時或元素被找到。
? 等待元素的使用也非常簡單,只需要在進入頁面后加入這個方法就行,如果熟練使用了之后我們每一次進行web測試都會默認添加implicitly_wait()方法。
? 如果是正常運行的話通過這種方式獲取的結果應為:
通過By.CLASS_NAME定位:
? 在這里統統class_NAME進行定位置時我們需要特別注意,class_name屬性進行定位適用于類名唯一的元素。使用方法同上述方法基本相同。
import timefrom selenium import webdriver
from selenium.webdriver.common.by import By
from sqlalchemy.sql.base import elements#打開瀏覽器
driver = webdriver.Chrome()
#進入百度主頁
driver.get("https://www.baidu.com")
driver.implicitly_wait(2)
element = driver.find_element(By.CLASS_NAME,'s_ipt')
element.send_keys("測試")
time.sleep(2)
#關閉瀏覽器
driver.close()
? 我們也可以通過這種方式,進行輸入框的輸入。?
通過By.LINK_TEXT定位:
? ?這種定位僅支持<a>標簽并且文本內容必須完全一致,包括大小寫和空格,即使其他標簽包含相同的文本,也不會進行匹配,例如:
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# 初始化瀏覽器
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10) # 設置隱式等待時間try:# 步驟 1: 打開百度首頁driver.get("https://www.baidu.com")print("成功打開百度首頁")# 步驟 2: 使用 By.LINK_TEXT 定位"新聞"鏈接news_link = driver.find_element(By.LINK_TEXT, "新聞")# 驗證鏈接文本和 href 屬性 用于獲取html的屬性值print(f"找到鏈接: 文本='{news_link.text}', href='{news_link.get_attribute('href')}'")# 步驟 3: 點擊"新聞"鏈接news_link.click()print("點擊'新聞'鏈接")# 步驟 4: 等待并驗證頁面標題WebDriverWait(driver, 10).until(EC.title_contains("百度新聞"))current_title = driver.title()print(f"當前頁面標題: {current_title}")print("驗證結果: 頁面成功跳轉到百度新聞")# 步驟 5: 截圖保存(可選)driver.save_screenshot("baidu_news.png")print("截圖已保存為: baidu_news.png")except Exception as e:print(f"測試失敗: {e}")# 出錯時截圖driver.save_screenshot("error.png")
finally:# 等待 3 秒以便查看結果time.sleep(3)# 關閉瀏覽器driver.quit()print("測試完成,瀏覽器已關閉")
? 通過這種方式我們就可以通過文本內容獲取到<a>標簽中的一些屬性如超鏈接等。?
?