Использование Selenium (или любого другого драйвера, если на то пошло), мне никогда не приходилось беспокоиться о том, загружена ли страница или нет, за одним исключением: если страница заканчивает загрузку, затем загружает больше контента через AJAX.
Чтобы справиться с этим, вы можете использовать функцию вращения, как описано в руководстве Behat.
http://docs.behat.org/en/v2.5/cookbook/using_spin_functions.html
Преимущество этого является:
- Это не нужно использовать драйвер селена (например, вы могли бы использовать PhantomJS, если вы хотите ускорить над внешним видом).
- Он не сломается, если вы прекратите использование JQuery и переключиться на что-то другое (например, Угловое в $ httpProvider)
Я бы не Использовать их, хотя, задний след нарушается, и кто хочет, чтобы ждать во-вторых, между проверками. :)
Попробуйте это:
Предполагая, что вы используете Mink Context (спасибо Mick), вы можете просто проверить страницу каждую секунду или около того, пока желаемый текст либо появился или исчез, или данность истекло время ожидания, и в этом случае мы допустим ошибку.
/**
* @When I wait for :text to appear
* @Then I should see :text appear
* @param $text
* @throws \Exception
*/
public function iWaitForTextToAppear($text)
{
$this->spin(function(FeatureContext $context) use ($text) {
try {
$context->assertPageContainsText($text);
return true;
}
catch(ResponseTextException $e) {
// NOOP
}
return false;
});
}
/**
* @When I wait for :text to disappear
* @Then I should see :text disappear
* @param $text
* @throws \Exception
*/
public function iWaitForTextToDisappear($text)
{
$this->spin(function(FeatureContext $context) use ($text) {
try {
$context->assertPageContainsText($text);
}
catch(ResponseTextException $e) {
return true;
}
return false;
});
}
/**
* Based on Behat's own example
* @see http://docs.behat.org/en/v2.5/cookbook/using_spin_functions.html#adding-a-timeout
* @param $lambda
* @param int $wait
* @throws \Exception
*/
public function spin($lambda, $wait = 60)
{
$time = time();
$stopTime = $time + $wait;
while (time() < $stopTime)
{
try {
if ($lambda($this)) {
return;
}
} catch (\Exception $e) {
// do nothing
}
usleep(250000);
}
throw new \Exception("Spin function timed out after {$wait} seconds");
}
Это метод, который я использовал для использования, это просто и эффективный. Однако, на мой взгляд, этот тест включает ограничения на ***, как работает приложение, когда все, о чем вы должны заботиться, - это ***, если *** приложение работает. Если вы торгуете jQuery в любом месте своего приложения, это не сработает, и вы не сможете его повторно использовать в проектах, которые не используют jQuery. Это зависит также от того, что вы используете Selenium, когда ваши тесты должны * попробовать * быть независимыми от водителя. Хотя, как я уже сказал, это работает, и все просто. – DanielM
Я предполагаю, что вы можете вводить и включать jQuery динамически, если он не существует, чтобы иметь эту работу ... – Jimbo
Если у вас есть ошибка, сообщающая, что jQuery неизвестна, измените условие на: '(typeof jQuery! = 'Undefined' && 0 === jQuery.active) ' – nickel715