Playwright vs Selenium Speed Comparison

Selenium WebDriver is slightly faster than Playwright.

Test Setup

Test Script

TestWise supports Mocha too, i.e. JavaScript frameworks, such as Playwright. But using Ruby is much more fun!
it "End-to-End Selenium Raw" do
driver.find_element(:id, "username").send_keys("agileway")
driver.find_element(:id, "password").send_keys("testwise")
driver.find_element(:id, "remember_me").click
driver.find_element(:id, "username").submit
expect(driver.find_element(:tag_name, 'body').text).to include("Signed in")

driver.find_element(:xpath, "//input[@name='tripType' and @value='oneway']").click
Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "fromPort")).select_by(:text, "Sydney")
Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "toPort")).select_by(:text, "New York")
Selenium::WebDriver::Support::Select.new(driver.find_element(:id, "departDay")).select_by(:text, "02")
Selenium::WebDriver::Support::Select.new(driver.find_element(:id, "departMonth")).select_by(:text, "May 2016")
driver.find_element(:xpath, "//input[@value='Continue']").click

# now on passenger page
driver.find_element(:name, "passengerFirstName").send_keys("Bob")
driver.find_element(:name, "passengerLastName").send_keys("Tester")
driver.find_element(:name, "passengerLastName").submit

# on payment page
driver.find_element(:xpath, "//input[@name='card_type' and @value='master']").click
driver.find_element(:name, "holder_name").send_keys("Bob the Tester")
driver.find_element(:name, "card_number").send_keys("4242424242424242")
Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "expiry_month")).select_by(:text, "04")
Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "expiry_year")).select_by(:text, "2016")
driver.find_element(:xpath, "//input[@value='Pay now']").click
end
it('End to End Playwright', async function() {
this.timeout(5000)
await driver.locator('text=Login').click()
await driver.fill("#username", "agileway")
await driver.fill("#password", "testwise")
await driver.click("#remember_me")
await driver.click("input:has-text('Sign in')")
await driver.textContent("body").then(function(body_text) {
//console.log(body_text)
assert(body_text.contains("Signed in"))
});

const trip_radio = await driver.$$("input[name=tripType]");
await trip_radio[1].check();
await driver.selectOption("select[name='fromPort']", "New York");
await driver.selectOption("select[name='toPort']", "Sydney");
await driver.selectOption("select[name='departDay']", "02");
await driver.selectOption("#departMonth", "052021");
await driver.click("input:has-text('Continue')");

await driver.fill("input[name='passengerFirstName']", "Bob");
await driver.fill("input[name='passengerLastName']", "Tester");
await driver.click("input:has-text('Next')");

const card_type_radio = await driver.$$("input[name='card_type']");
await card_type_radio[1].check();
await driver.fill("input[name='holder_name']", "Bob the Tester");
await driver.fill("input[name='card_number']", "4242424242424242");
await driver.selectOption("select[name='expiry_month']", "04");
await driver.selectOption("select[name='expiry_year']", "2016");
await driver.click("input:has-text('Pay now')");
});

Benchmark Results (raw)

Raw Playwright: The best of 3 runs, the other two: 2.23, 2.50
Raw Playwright: The best of 3 runs, the other two: 2.43, 2.44

Refactored Versions

it "End-to-End Selenium POM" do
login_page = LoginPage.new(driver)
login_page.enter_username("agileway")
login_page.enter_password("testwise")
login_page.check_remember_me
login_page.click_sign_in
expect(driver.find_element(:tag_name, 'body').text).to include("Signed in")

flight_page = FlightPage.new(driver)
flight_page.select_trip_type("oneway")
flight_page.select_depart_from("Sydney")
flight_page.select_arrive_at("New York")
flight_page.select_depart_day("02")
flight_page.select_depart_month("May 2016")
flight_page.click_continue

passenger_page = PassengerPage.new(driver)
passenger_page.enter_first_name("Bob")
passenger_page.enter_last_name("Tester")
passenger_page.click_next

payment_page = PaymentPage.new(driver)
payment_page.select_card_type("master")
payment_page.enter_holder_name("Bob the Tester")
payment_page.enter_card_number("4242424242424242")
payment_page.enter_expiry_month("04")
payment_page.enter_expiry_year("2016")
payment_page.click_pay_now
end
it('E2E Playwright POM', async function() {
this.timeout(5000);

let login_page = new LoginPage(driver);
await login_page.enterUsername("agileway");
await login_page.enterPassword("testwise");
await login_page.checkRememberMe();
await login_page.clickSignIn();
await driver.textContent("body").then(function(body_text) {
assert(body_text.contains("Signed in"));
});

let flight_page = new FlightPage(driver);
await flight_page.selectTripType("oneway");
await flight_page.selectDepartFrom("New York");
await flight_page.selectArriveAt("Sydney");
await flight_page.selectDepartDay("02");
await flight_page.selectDepartMonth("052021");
await flight_page.clickContinue();

let passenger_page = new PassengerPage(driver);
await passenger_page.enterFirstName("Bob");
await passenger_page.enterLastName("Tester");
await passenger_page.clickNext();

let payment_page = new PaymentPage(driver);
await payment_page.selectCardType("master");
await payment_page.enterHolderName("Bob the Tester");
await payment_page.enterCardNumber("4242424242424242");
await payment_page.enterExpiryMonth("04");
await payment_page.enterExpiryYear("2016");
await payment_page.clickPayNow();
});
Raw Selenium POM: The best of 3 runs, the other two: 2.24, 2.49
Raw Playwright: The best of 3 runs, the other two: 2.35, 2.35

Findings

https://www.cypress.io/how-it-works/

--

--

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store