Мой вопрос довольно прост. Я из мира 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-исполнителя: для меня лучший вариант — запускать методы тестового примера программно!
Ну, очень хороший вопрос в первую очередь. Короткий ответ: да, можно, но это слишком больно. 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: поделитесь ссылкой на проект, когда он будет запущен, если он открыт.
Я думаю, что боль заключается в попытке использовать интеграцию 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 тривиально.