# 7/8共筆 {%hackmd 1lpg7PuqRoaui6XyJcrylw %} ## Web GUI測試 - Selenium ``` docker run -d -p 4444:4444 -p 7900:7900 -v /dev/shm:/dev/shm selenium/standalone-chrome:4.0.0-rc-1-prerelease-20210618 ``` ```python= driver = webdriver.Remote( command_executor='http://host.docker.internal:4444/wd/hub', desired_capabilities=DesiredCapabilities.CHROME) ``` :bulb: **Tip** 可以先在 WSL 用 `docker ps` 指令來檢查目前 Container 和 Local Host 之間 Port 轉傳的對應 - 設定 `command_executor` 時設定正確的對應 Port 才能成功開啟 Web driver - `0.0.0.0:4444 -> 4444/tcp` 意思是指定實體主機的 4444 Port 對應到 Container 4444 Port ![](https://i.imgur.com/RszYSDc.png) :warning: 當設定不正確的 Local Host Port 時可以在 Console 看到以下錯誤 * `ConnectionRefusedError: [Errno 111] Connection refused` - noVNC - URL `http://localhost:7900/` - 登入密碼為 " `secret` " ![](https://i.imgur.com/ZCdRQNM.png) :bulb: **Tip** 使用remote時,記得要把driver.quit(),因為如果沒有quit(),seesion滿了,你就會連不上了 :bulb: **Tip** 關於Wait的使用方式,建議可以使用Selenium裡面的wait,就可以避免硬性的等待 1. 直接等待某個時間:implicitly_wait(5),後續的每一個driver.find_element都會等 [Implicit Waits 官方說明](https://selenium-python.readthedocs.io/waits.html#implicit-waits) 2. 等待某件事情結束或某個頁面結束再進行:wait.until(EC.alert_is_present()).accept() 這個舉例是他在等alert,詳情可以爬wait.until的用法 ps:有loading時建議使用2,因為使用1可能會有時間到時element沒有出現 3. WebDriverWait(driver, 5) 用於等待web loading 5秒 :bulb: **Tip** XPath學習: [w3schools XPath Tutorial](https://www.w3schools.com/xml/xpath_intro.asp) - 選哪個Framework? - 較建議從cucumber開始寫,若時間上允許,同樣的測項在換到robot上實作一次。 - 怎麼開始? - 從寫測項開始 不管有無寫好的測試,均從寫測項開始,也就是在建立一個測項時步驟會如何撰寫 先想測項怎麼寫,之後再處理implement code ### 課堂QA - Webdriver 是不是會遇到有需要定期更新的問題? 1. 如果是Local測試,有可能會需要定期更新,不然你也會遇到版本不同沒辦法執行測試的狀況 2. 如果使用contanier或許就可以固定版本 3. Selenium Container 的另一個好處如果要做跨版本的相容性測試相對容易(如果真的要做的話) - git使用原則 - 遠端的版本,建議避免放上一個還無法執行的code,避免他人如果pull下來後,會發現這塊無法使用 - 在local端放還不能執行的就沒關係 :question: - 機器Click某個element後就會重啟,有沒有什麼比較好的方式,可以來確定這台機器重開機了? 1.讀CLI的console固定字串,來判斷是否重開成功 (假設你的機器不支援console此方法無法使用) 2.使用PING的方式去做確認,例如連續Ping5~10次成功 3.其他 待討論 --- - Delbert,MRC有開始實作討論,目前沒有 - 時做過程提出的問題該如何分享給大家 - 會議上提出的 - 實作過程提出 - 發起討論Implement Code中的function該怎麼管理(命名...) - 評估目表怎麼使用?