Web自動化測試之playwright:Web元素操作


定位到元素后就可以對其進行某些操作,比如輸入文本,點擊,獲取屬性等,本文來介紹playwright提供的元素操作方法。

文本輸入

文本輸入使用 fill方法:

page.fill("id=kw", "test")

模擬鍵盤輸入

1、一個字符一個字符的輸入,模擬真實的鍵盤輸入

  • page.type("id=kw", "playwright")
  • page.type("id=kw", "playwright", delay=100): 每個字符延遲100ms輸入

2、模擬按鍵
支持各種鍵盤事件,比如Tab、Delete、Enter、PageDown、PageUp、F1 - F12、0-9、A-Z等

  • page.press("id=kw", '@') : 模擬鍵盤輸入 @ 符號
  • page.press("id=kw", 'Control+A'):Control+A
  • page.press('id=kw', 'Enter'):點擊回車

測試百度搜索:

def test_press(self):
    self.page.goto("https://www.baidu.com/")
    self.page.type("id=kw", "playwright", delay=100)
    self.page.press("id=kw", '@')
    self.page.press("id=kw", 'Control+A')
    self.page.press("id=kw", 'Delete')
    self.page.press("id=kw", "Control+Z")
    self.page.press('id=kw', 'Enter')
    sleep(5)

點擊

包括以下幾種鼠標操作方法:

  • 左鍵點擊:page.click("id=su")
  • 點擊元素左上角:page.click('id=su', position={'x': 0, 'y': 0})
  • Shift + click:page.click("id=su", modifiers=['Shift'])
  • 強制點擊:page.click("id=su", force=True)
  • 右鍵點擊:page.click("id=su", button='right')
  • 雙擊:page.dblclick("id=su")
  • 懸停在元素上:page.hover('id=su')

測試下面的頁面,測試頁面地址:https://sahitest.com/demo/clicks.htm

from time import sleep

from playwright.sync_api import sync_playwright

class TestInput():
    def setup(self):
        playwright = sync_playwright().start()
        self.browser = playwright.chromium.launch(headless=False)
        self.context = self.browser.new_context()
        self.page = self.context.new_page()

    def teardown(self):
        self.browser.close()

    def test_click(self):
        self.page.goto("https://sahitest.com/demo/clicks.htm")
        self.page.click('"click me"')
        self.page.dblclick('"dbl click me"')
        self.page.click('"right click me"', button='right')
        self.page.click('"right click me"', modifiers=["Shift"])
        self.page.hover('"Clear"')
        self.page.hover('"Clear"')
        self.page.click('"Clear"', position={'x': 0, 'y': 0})
        sleep(5)

Checkbox、Radio操作

使用 checkuncheck 來勾選或者取消勾選 Checkbox 和 Radio 。

  • 勾選:page.check('#agree')
  • 取消勾選:page.uncheck('#agree')
  • 判斷是否勾選:page.is_checked('#agree')

測試頁面地址:https://sahitest.com/demo/clicks.htm

def test_checkbox_radio(self):
    self.page.goto("https://sahitest.com/demo/clicks.htm")

    # checkbox
    self.page.click('[type="checkbox"][value="Click me"]') # 點擊checkbox
    self.page.check('[type="checkbox"][value="Click me"]') # 勾選checkbox

    assert self.page.is_checked('[type="checkbox"][value="Click me"]') is True
    self.page.uncheck('[type="checkbox"][value="Click me"]') # 取消勾選checkbox

    # radio
    self.page.check(':nth-match([type="radio"], 1)') # 勾選radio
    sleep(2)
    self.page.click(':nth-match([type="radio"], 2)') # 點擊radio
    sleep(5)

select選項

使用 select_option() 方法對 <select> 元素進行操作:

  • page.select_option('select#colors', 'blue') :單選,通過 value 值進行選擇
  • page.select_option('select#colors', label='Blue'):單選,通過 label 值進行選擇
  • page.select_option('select#colors', vaule=['red', 'green', 'blue']):多選,通過 value 值進行選擇
  • page.select_option('select#colors', label=['Red', 'Green', 'Blue']):多選,通過 label 值進行選擇

測試頁面地址:http://sahitest.com/demo/selectTest.htm

def test_select(self):
    self.page.goto("http://sahitest.com/demo/selectTest.htm")
    self.page.select_option('select#s3Id', 'o1val') # 單選,通過value選擇
    self.page.select_option('select#s3Id', label='o2') # 單選,通過label選擇
    self.page.select_option('select#s4Id', value=['o1val','o2val','o3val'])
    self.page.select_option('select#s4Id', label=['o1','o2','o3'])
    sleep(5)

上傳文件

使用 set_input_files 方法來上傳文件:

  • page.set_input_files('input#upload', 'myfile.pdf'):上傳單個文件
  • page.set_input_files('input#upload', ['file1.txt', 'file2.txt']):上傳多個文件
  • page.set_input_files('input#upload', []):移除選擇的文件

上傳圖片:

def test_upload_files(self):
	self.page.goto("https://image.baidu.com/")
	self.page.click("id=sttb")
	self.page.click("id=uploadImg")
	self.page.set_input_files('id=stfile', 'd://test.jpg')
	sleep(5)

截圖

1、截取當前頁面

page.goto("https://www.baidu.com/")
# 方法1
page.screenshot(path="screenshot1.png")
# 方法2
page.screenshot(path="screenshot2.png", full_page=True)
# 方法3:
screenshot_bytes = self.page.screenshot()
open("screenshot3.png", "wb").write(screenshot_bytes)

2、截取指定元素

截取【百度一下】

element_handle = self.page.query_selector("id=su")
element_handle.screenshot(path="baidu.png")

獲取、判斷元素屬性及狀態

1、讀取屬性:get_attribute(selector, attr_name)

斷言【百度一下】的type屬性:

attr_value = self.page.get_attribute("id=su", "type")
assert attr_value == "submit"

2、元素是否可見:is_visible(selector)

visible = self.page.is_visible("id=su")
assert visible

3、元素是否可用:is_enabled(selector)

enabled = self.page.is_enabled("id=su")
assert enabled

4、是否勾選:page.is_checked(selector)

assert page.is_checked(selector) is True

5、inner text判斷

百度一下首頁【hao123】

text = page.inner_text('#s-top-left:has(a) > a:nth-child(2)')
assert text == "hao123"

6、文本內容判斷

content = page.text_content('#s-top-left:has(a) > a:nth-child(2)')
assert content == "hao123"

參考:

  1. https://playwright.dev/python/docs/input
  2. https://playwright.dev/python/docs/screenshots
--THE END--


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM