понедельник, 11 ноября 2013 г.

Сравнение скорости работы наиболее популярных языков для автоматизации( обновление, добавлен PHP)

Заголовок немного неверный, но не знал как написать лучше. На самом деле мы будем сравнивать байндинги языков для вебдрайвера.

В качестве единого теста для всех будет использоваться один сценарий:


  1. Открываем страницу http://yopolis.ru/site/login
  2. Вводим данные для авторизации
  3. Кликаем по кнопке войти
  4. Проверяем что присутствует элемент со ссылкой на профиль пользователя
 Итак код теста:

Java:

package com.yopolis.tests;


import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.seleniumhq.selenium.fluent.FluentWebDriver;
import org.seleniumhq.selenium.fluent.Period;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.openqa.selenium.By.*;
import static org.seleniumhq.selenium.fluent.Period.secs;


public class YopolisExample {

    Long start=null;
    WebDriver wd=null;
    FluentWebDriver fwd=null;
    Long stop =null;

    @Before
    public void setUp(){
       start = System.currentTimeMillis();
       wd = new FirefoxDriver();
       fwd = new FluentWebDriver(wd);
    }

    @Test
    public void firstTest(){
        wd.get("http://yopolis.ru/site/login");
        fwd.input(id("LoginForm_username")).sendKeys("****@yandex.ru");
        fwd.input(name("LoginForm[password]")).sendKeys("******");
        fwd.button(name("yt0")).click();
        assertThat(fwd.within(secs(5)).has().link(xpath("//a[contains(@href,'/profile')]")),is(true));

    }

    @After
    public void tearDown(){
        wd.close();
        stop = System.currentTimeMillis();
        System.out.println("That took " + (double)((stop - start)/1000) + " seconds");

    }
}



Ruby:

require('selenium/webdriver')

beginning = Time.now
wd= Selenium::WebDriver.for :firefox
wd.navigate.to "http://yopolis.ru/site/login"
wd.find_element(:id,'LoginForm_username').send_keys "****@yandex.ru"
wd.find_element(:name,'LoginForm[password]').send_keys "******"
wd.find_element(:name,'yt0').click
puts wd.find_element(:xpath,'//a[contains(@href,"/profile")]').displayed?
wd.close
puts "Time elapsed #{Time.now - beginning} seconds"


Python:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from datetime import datetime

startTime = datetime.now()

driver = webdriver.Firefox()
driver.get("http://yopolis.ru/site/login")
driver.find_element_by_id("LoginForm_username").send_keys("****@yandex.ru")
driver.find_element_by_name("LoginForm[password]").send_keys("******")
driver.find_element_by_name("yt0").click()

wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.XPATH,'//a[contains(@href,"/profile")]')))
driver.quit()

print(datetime.now()-startTime)



WebDriverJs:

var assert=require('assert');
var webdriver = require('selenium-webdriver'),
    SeleniumServer = require('selenium-webdriver/remote').SeleniumServer;

var server = new SeleniumServer('/Users/aalekseev/selenium-server-standalone-2.37.0.jar', {
    port: 4444
});

server.start();

console.time('test exec');

var driver = new webdriver.Builder().
    usingServer(server.address()).
    withCapabilities(webdriver.Capabilities.firefox()).
    build();

driver.get("http://yopolis.ru/site/login");
driver.findElement(webdriver.By.id("LoginForm_username")).sendKeys("****@yandex.ru");
driver.findElement(webdriver.By.name("LoginForm[password]")).sendKeys("******");
driver.findElement(webdriver.By.name("yt0")).click();
var disp=driver.findElement(webdriver.By.xpath('//a[contains(@href,"/profile")]')).isDisplayed();
assert.ok(disp);

driver.quit().then(function(){
    console.timeEnd('test exec');
});

server.stop();

PHP:
Используется: php-webdriver
$start = time();
 
$capabilities = array(WebDriverCapabilityType::BROWSER_NAME => 'firefox');
$driver = RemoteWebDriver::create('http://localhost:4444/wd/hub', $capabilities);
 
$driver->get("http://yopolis.ru/site/login");
 
$driver->findElement(WebDriverBy::id('LoginForm_username'))->sendKeys("****@yandex.ru");
$driver->findElement(WebDriverBy::name('LoginForm[password]'))->sendKeys("******");
$driver->findElement(WebDriverBy::name('yt0'))->click();
 
try {
echo $driver->findElement(WebDriverBy::xpath('//a[contains(@href,"/profile")]'))->isDisplayed();
} catch (NoSuchElementWebDriverError $e) {
}
 
$driver->close();
 
echo "Time elapsed ".(time()-$start)." seconds";
Результаты: Java: 14 секунд
Ruby: 8 секунд
Python: 7 секунд
JS: 20 секунд
PHP: 9 секунд

4 комментария:

  1. Этот комментарий был удален автором.

    ОтветитьУдалить
  2. Пришлось удалить прошлый комментарий - парсер лох.

    Добавьте в сравнение PHP:

    git clone https://github.com/facebook/php-webdriver.git

    Запустить этот файл:

    https://gist.github.com/DavertMik/7488648

    ОтветитьУдалить