我們非常高興地宣佈Selenium 4的釋出。這適用於Java、.net、Python、Ruby和Javascript。你可以從你最喜歡的包管理器或GitHub下載它!
https://github.com/SeleniumHQ/selenium/releases/tag/selenium-4.0.0
如果您已經是一個Selenium使用者,那麼這個更新應該很簡單,只需改變依賴從3.x
切換4.0.0
即可。我們一直在努力確保這是一個無痛
升級,重點是保持公共API儘可能穩定。
當然,我們已經做了一些更改,所以如果您依賴於那些標記為Selenium內部的程式碼,或者那些已棄用的程式碼,那麼您可能會遇到一些問題。請檢視我們的文件,瞭解如何處理我們所知道的每個常見問題。
https://www.selenium.dev/documentation/getting_started/how_to_upgrade_to_selenium_4/
Selenium4 不僅僅是一個穩定的版本!它帶來了一大堆新的和令人興奮的特性,我們希望這些特性將使您的測試編寫起來更加有趣!執行時更穩定!讓我們來看看其中的一些新功能!
相對定位器
我們已經介紹了相對定位器
。它們允許您使用人們也使用的語言指定在頁面上可以找到元素的位置;比如在那個元素之上
,或者在另一個元素的右邊
。這將為您提供一種工具來應對複雜定位器,使您的測試讀起來更清楚一些,並更能適應頁面DOM的變化。我們不是第一個想到這個主意的人——這個榮譽屬於Sahi
(注:Sahi一款web自動化工具)——但如果你以前沒有用過,我們希望你喜歡!
from selenium.webdriver.common.by import By
from selenium.webdriver.support.relative_locator import locate_with
passwordField = driver.find_element(By.ID, "password")
emailAddressField = driver.find_element(locate_with(By.TAG_NAME, "input").above(passwordField))
above()
用於要查詢的元素在指定元素
的上方。
基於Firefox/Chromium的新功能
如果你使用的是火狐或源自於Chromium的瀏覽器,我們也增加了一大堆新功能。這些方法包括處理“基本”和“摘要”身份驗證
;網路監聽(Are you an HTTP 418?);以及執行常見請求的任務,如等待DOM的更新
,或提供檢視Javascript錯誤的方法。
- 認證
const {Builder} = require('selenium-webdriver');
(async function example() {
try {
let driver = await new Builder()
.forBrowser('chrome')
.build();
const pageCdpConnection = await driver.createCDPConnection('page');
await driver.register('username', 'password', pageCdpConnection);
await driver.get('https://the-internet.herokuapp.com/basic_auth');
await driver.quit();
}catch (e){
console.log(e)
}
}())
注:python 沒有
register()
方法,目前還不確定是否為bug。
- Are you an HTTP 418?
這就是個玩笑。IETF在1998年愚人節時釋出的一個笑話RFC,具體可以參考RFC 2324 - Hyper Text Coffee Pot Control Protocol (HTCPCP/1.0)超文字咖啡壺控制協議。htcpcp1.0協議中的418的意義是:當客戶端給一個茶壺傳送泡咖啡的請求時,茶壺就返回一個418錯誤狀態碼,表示"我是一個茶壺" 或者 "我是個杯具"。
- 等待DOM的更新
const {Builder, until} = require('selenium-webdriver');
const assert = require("assert");
(async function example() {
try {
let driver = await new Builder()
.forBrowser('chrome')
.build();
const cdpConnection = await driver.createCDPConnection('page');
await driver.logMutationEvents(cdpConnection, event => {
assert.deepStrictEqual(event['attribute_name'], 'style');
assert.deepStrictEqual(event['current_value'], "");
assert.deepStrictEqual(event['old_value'], "display:none;");
});
await driver.get('dynamic.html');
await driver.findElement({id: 'reveal'}).click();
let revealed = driver.findElement({id: 'revealed'});
await driver.wait(until.elementIsVisible(revealed), 5000);
await driver.quit();
}catch (e){
console.log(e)
}
}())
我們以一種與現有api相適應的方式新增了這些新特性。沒有必要重寫您的測試:只要在您覺得合適的時候使用新特性即可。
Selenium Grid
我們還重建了Selenium Grid,借鑑了Zalenium和Selenoid等成功專案的經驗,以增強其能力。這個新的Grid就像在傳統的Hub
和Node
配置中一樣,可以在單臺機器上執行單個程式,但它也支援完全分散式模式,用於執行Kubernetes的現代基礎設施。它具有更好的內建安全性,因為我們知道保護Grid可能是一項困難的任務。在所有這些規模和大小,我們新增到語言繫結的所有新特性都將按照預期工作。
Grid還可以管理本地機器上的Docker容器,拉出獨立的firefox伺服器之類的影像,這樣您的基礎設施維護就會稍微輕鬆一些。
最後,Grid更容易管理。我們修改了UI,將其置於GraphQL模型之上,任何人都可以自由查詢並使用它來建立自己的Grid視覺化或監視器。如果您想檢視正在執行的會話,可以開啟並與之互動的實時VNC(虛擬網路計算機)預覽,從而更好地瞭解正在發生的事情。如果你想要更多的資訊,我們已經在網格中整合了對OpenTelemetry的支援,所以現在你可以確切地知道發生了什麼,在哪裡,什麼時候。
感謝
我知道說這是一種“非常愉快”的陳詞濫調,但說實話,這是真的。開發這個新版本的Selenium是一個與一些了不起的工程師一起工作的機會,也是一個充滿活力和活力的社群的一部分。與這些人一起編寫這些程式碼非常有趣,在這裡向儘可能多的人說“謝謝”感覺是正確的。所以,不用再等了。
最後
本文試著對《Announcing Selenium 4》進行了簡單的翻譯,本來懷著激動的心情來的,結果當我一一驗證這些新特性的時候,非常糟糕!這特麼就是打磨這麼久出的 4.0 正式版。
- python(Selenium)API缺失。
- 官方文件的例子不完整,還有錯誤。
https://github.com/SeleniumHQ/seleniumhq.github.io/issues/800