<style> .center{ display: flex; justify-content: center; } .txt_color{ color: #224499; } .split_line{ border-bottom-style: solid; border-width: 1px; border-color: #999999; } .txt_center{ text-align: center; } .lighten_txt{ color: #aa0000; } .red_txt{ color: #DD2200; } </style> # Playwight 程式元件介紹 ### 程式碼中指定瀏覽器啟動 ```python from playwright.sync_api import sync_playwright with sync_playwright() as playwright: browser = playwright.chromium.launch(headless=False) # firefox ↓ # playwright.firefox.launch(headless=False) # webkit ↓ # playwright.webkit.launch(headless=False) # 如果無法執行, 可能會需要安裝 sudo apt-get install gstreamer1.0-plugins-bad context = browser.new_context() page = context.new_page() page.goto("https://www.google.com/?hl=zh_tw") page.wait_for_timeout(timeout=2000) # Close page page.close() context.close() browser.close() ``` ### 設定執行時不顯示畫面 ```python browser = playwright.chromium.launch(headless=True) ``` ### 以較慢動作執行腳本 ```python browser = playwright.chromium.launch(headless=False, slow_mo=毫秒) ``` ### 讀取 json cookie 狀態 ```python context = browser.new_context(storage_state="filename.json") ``` ### 設定畫面尺寸 - 瀏覽器 ```python context = browser.new_context( viewport={ "width": 1920, "height": 1080 }) ``` - 單個分頁 ```python ... page.set_viewport_size( viewport_size={ "width": 1920, "height": 1080 }) page.goto("url") ``` - 指定手機尺寸 ```python context = browser.new_context( **playwright.devices['Pixel 2'], ) ``` ### 程式中接續錄製腳本 ==playwright.chromium.launch(headless=False) 的狀態才能進行錄製[才看的到畫面]== ```pyhton # 在程式碼中要繼續錄製的部份加上 page.pause() ``` ### 取得網頁元件的方式 - <span class="lighten_txt">query_selector</span> - Text selector - CSS selector - [css 元件補充](https://webdevsimplified.com/specificity-cheat-sheet.html) - XPath selectors `找元件的輔助工具` - [X_Path_查詢](https://devhints.io/xpath) - [Google擴充-SelectorsHub](https://chrome.google.com/webstore/detail/selectorshub/ndgimibanhlabgdgjcpbbndiehljcpfh) - Id selectors - id - data-testid - data-test-id - data-test <div class="txt_color">透過 text 找目標元件</div> ```python page.query_selector('元件:has-text("包含文字")') page.query_selector('css類別:text("包含文字")') page.query_selector('元件>>text=包含文字') ``` <div class="txt_color">透過元件狀態[visible]找目標元件</div> ```python page.query_selector("button:visible") page.query_selector("button:visible:text('包含文字')") ``` <div class="txt_color">透過元件 id 找目標元件</div> ```python page.query_selector(selector="#id") ``` [Element selectors](https://playwright.dev/python/docs/selectors) ### 取得元件-實際範例 :::spoiler ```script from playwright.sync_api import sync_playwright def run(playwright): browser = playwright.chromium.launch(headless=False, slow_mo=500) context = browser.new_context() page = context.new_page() page.goto("http://www.uitestingplayground.com/dynamicid") # 透過元件ID element_id = page.query_selector(selector="#b4d2b80c-2be1-6d56-4dba-21b02b696137") assert element_id is None # 透過 元件 with_element_attribute = page.query_selector(selector="button:visible") element_attribute_with_text1 = page.query_selector(selector="button:visible:text('Button with Dynamic ID')") element_attribute_with_text2 = page.query_selector(selector="button>>text=Button with Dynamic ID") element_attribute_with_text3 = page.query_selector(selector="button:has-text('Button with Dynamic ID')") assert with_element_attribute.text_content() == element_attribute_with_text1.text_content() and \ with_element_attribute.text_content() == element_attribute_with_text2.text_content() and \ with_element_attribute.text_content() == element_attribute_with_text3.text_content() # 透過 css element_css = page.query_selector(selector=".btn-primary") element_css_with_text1 = page.query_selector(selector=".btn-primary:text('Button with Dynamic ID')") element_css_with_text2 = page.query_selector(selector=".btn-primary:has-text('Button with Dynamic ID')") assert element_css.text_content() == element_css_with_text1.text_content() and \ element_css.text_content() == element_css_with_text2.text_content() context.close() browser.close() def main(): with sync_playwright() as playwright: run(playwright) if __name__ == "__main__": main() ``` ::: ### 對元件執行動作 #### 點擊元件 - <span class="lighten_txt">click</span> ```python page.click(selector="") ``` #### 在輸入框輸入內容 - <span class="lighten_txt">fill, type</span> - fill : <span class="red_txt">元件需要是 input, textarea 或 contenteditable</span> ```python page.fill(selecetor="", value="") ``` - type : <span class="red_txt">模擬按鍵操作輸入內容</span> ```python page.type(selecetor="", value="", delay=毫秒) ``` #### 勾選 CheckBox - <span class="lighten_txt">check, uncheck</span> - 選取勾選選項 ```python page.check(selecetor="") ``` - 取消勾選選項 ```python page.unchecked(selecetor="") ``` #### 選取選單內容 - <span class="lighten_txt">select_option</span> [官方文件說明](https://playwright.dev/python/docs/api/class-page/#page-select-option) - 單選選單 ```python page.select_option(selector="", value="") ``` ```python page.select_option(selector="", label="") ``` - 多選選單 ```python page.select_option(selector="", value=["red", "green", "blue"]) ``` <hr> <!-- [End to End 目錄](https://hackmd.io/F41miM4aRP2eljbPy6grCg) --> ###### tags: `Playwright` `End to End`