Выполнение тестов PHP Selenium Webdriver программно, без команды phpunit

Мой вопрос довольно прост. Я из мира Python, где очень просто выполнить тестовый код Selenium внутри программы, просто написав что-то вроде:

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("http://www.python.org")
driver.close()

При использовании PHP все становится сложнее: я написал что-то подобное

require 'vendor/autoload.php';

class MyTest extends PHPUnit_Extensions_Selenium2TestCase {

public function setUp() {
$this->setBrowser('Firefox');
$this->setBrowserUrl('http://www.python.org');
}

public function testToto() {
$this->url('/');
}

}

…который работает, когда я выполняю phpunit MyTest.php,

Но то, что я хотел бы сделать, это создать мой тестовый класс в PHP-коде и выполнить мои команды Selenium «программно», лайк:

$myTest = new MyTest();
$myTest->testToto();

И вот это отстой 🙁

Неустранимая ошибка PHP: необработанное исключение «PHPUnit_Extensions_Selenium2TestCase_Exception» с сообщением «В настоящее время нет активного сеанса для выполнения команды« url ».

Так Есть ли способ выполнить код Selenium непосредственно из сценария PHP без выполнения вещей из командной строки с помощью phpunit?

редактировать: Чего я пытаюсь достичь? Мой проект заключается в создании тестового приложения, которое должно иметь возможность запускать тесты в пользовательском интерфейсе, созданном конечным пользователем, благодаря удобному в использовании конструктору перетаскивания (пользователь выбирает, какой тест он хочет выполнить первым, затем другой и т. Д.). ). Поэтому я бы хотел, чтобы уклоняться от выполнения команд phpunit с помощью уродливого PHP-исполнителя: для меня лучший вариант — запускать методы тестового примера программно!

2

Решение

Ну, очень хороший вопрос в первую очередь. Короткий ответ: да, можно, но это слишком больно. PHPUnit — это просто скромно сложная, огромная, страшная и удивительная библиотека с gadzillion расширений. В двух словах, он читает конфигурацию, находит тесты и запускает их.

Вы можете установить точку останова в своем тесте и проследить, что он делает, какие параметры он принимает, и буквально имитировать все это. Это был бы «правильный» и сумасшедший путь, и самый сложный тоже.

Более простым способом было бы выяснить, что нужно классу тестового примера для запуска (точка останова). & след всегда ваши лучшие друзья), в данном конкретном случае это оказалось именно так:

$myTest = new MyTest();
$myTest->setUp();           // Your setup will always be called prior the test.
$myTest->prepareSession();  // Specific to Selenium test case, called from `runTest` method.
$myTest->testToto();

Но даже в PHPUnit_Extensions_Selenium2TestCase Есть много вещей, которые не являются общедоступными, и это просто удача. Но ты получил идею. Кроме того, простой вызов метода класса тестового примера приведет к двум вещам: ничего не произойдет, или вы получите исключение. Вся необычная трассировка результатов происходит выше в иерархии.

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

редактировать

exec может показаться уродливым, но это есть по очень веской причине: изоляция процесса. Существуют ситуации, когда один тестируемый фрагмент кода изменяет среду, и он вступает в конфликт с другим фрагментом кода, например, связанным с сеансом, отправленными заголовками и т. Д. Когда вы столкнетесь с одним из них, вы будете молиться о exec,

В вашем случае проще всего было бы запустить PHPUnit из командной строки, но вам может потребоваться написать собственный форматировщик, чтобы извлечь из него данные в нужном формате, если вы не удовлетворены существующими.

Другой вариант — использовать существующий клиент для WebDriver / Selenium и просто отправлять команды непосредственно на сервер Selenium. Я полагаю, это то, что вам действительно нужно? Вы можете найти фрагмент кода, отвечающий за это, в расширении PHPUnit или в другом классном проекте под названием Behat (и Mink). Я считаю, что их клиент находится в Behat / MinkSelenium2Driver репозиторий. И если вам они не нравятся, я уверен, что есть другие php-оболочки, которые вы можете найти на github, или можете создать свои собственные, используя существующие в качестве примера.

PS: поделитесь ссылкой на проект, когда он будет запущен, если он открыт.

1

Другие решения

Я думаю, что боль заключается в попытке использовать интеграцию PHPUnit Webdriver без реального использования PHPUnit.

Вы можете написать код, подобный вашему примеру с Python, используя отдельную реализацию Webdriver (которая не требует PHPUnit). Я рекомендую тот, написанный на Facebook:

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

но есть еще несколько:

http://docs.seleniumhq.org/docs/03_webdriver.jsp#php

Вы также можете использовать эти реализации внутри тестов PHPUnit. Я делаю это, потому что мне не нравится реализация PHPUnit Webdriver.

С их помощью написать свой пример на PHP тривиально.

2

По вопросам рекламы [email protected]