Мне нужно утвердить заголовок страницы для моего теста, который является заголовком вкладки/окна с помощью Behat+Mink
Я попробовал getWindowName(), но понял, что это не та функция, которую я ищу.
Как утвердить заголовок страницы/вкладки/окна в Behat + Mink
Ответы (3)
Вы должны использовать обычный поиск с помощью css для тега заголовка и использовать getText() для получения заголовка.
CSS должен быть: "head title"
Ваше решение почти в порядке, вам нужно следить за возможными исключениями, особенно фатальными, которые могут остановить ваш пакет, если они возникнут.
Например, метод find()
вернет объект или null
, если будет возвращен null
и вы используете для него getText()
, это приведет к фатальному исключению, и ваш набор остановится.
Немного улучшенный метод:
/**
* @Given /^the page title should be "([^"]*)"$/
*/
public function thePageTitleShouldBe($expectedTitle)
{
$titleElement = $this->getSession()->getPage()->find('css', 'head title');
if ($titleElement === null) {
throw new Exception('Page title element was not found!');
} else {
$title = $titleElement->getText();
if ($expectedTitle !== $title) {
throw new Exception("Incorrect title! Expected:$expectedTitle | Actual:$title ");
}
}
}
Улучшения:
- обработано возможное фатальное исключение
- генерировать исключение, если элемент не найден
- генерировать исключение с подробностями, если заголовки не совпадают
Обратите внимание, что вы также можете использовать другие методы для проверки заголовка, такие как: stripos
, strpos
или просто сравнивать строки, как это сделал я. Я предпочитаю простое сравнение, если мне нужен точный текст или метод strpos/stripos в php, и лично я избегаю регулярных исключений и связанных методов, таких как preg_match, которые обычно немного медленнее.
Одним из основных улучшений, которое вы могли бы сделать, является наличие метода ожидания элемента и обработки исключения для вас, а также использование его вместо простого поиска, поиск, который вы можете использовать, когда вам нужно принять решение на основе наличия элемента, например: если элемент существует сделать это еще..
Спасибо Лауда. Да, это действительно сработало. Написал функцию ниже:
/**
* @Given /^the page title should be "([^"]*)"$/
*/
public function thePageTitleShouldBe($arg1)
{
$actTitle = $this->getSession()->getPage()->find('css','head title')->getText();
if (!preg_match($arg1, $actTitle)) {
throw new Exception ('Incorrect title');
}
}
Это не сработало для меня в случаях, когда заголовок манипулируется с помощью Javascript и history.pushState/replaceState
Вот реализация, которая работает для Javascript:
/**
* @Then /^the title is "([^"]*)"$/
*/
public function theTitleIs($arg1) {
$title = $this->getSession()->evaluateScript("return document.title");
if ($arg1 !== $title) {
throw new \Exception("expected title '$arg1', got '$title'");
}
}