Итак продолжая тему тестирования веб приложений, кратко опишу возможности Selenium RC в сочетании c PHPUnit.
Для написания тестов под selenium в PHPUnit существует расширение PHPUnit_Extensions_SeleniumTestCase. Это класс от которого следует наследоваться при написании тестовых случаев. При написании тестовых случаев следует учитывать, что каждый файл может содержать только один класс, т.е. например в файле FirstTest.php должен размещаться класс FirstTest.
Браузеры и платформы
При объявлении класса можно указать под какими браузерами и платформами должны выполняться тесты. Для этого служит свойство класса $browsers. Например так:
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
class FirstTest extends PHPUnit_Extensions_SeleniumTestCase
{
public static $browsers = array
(
array
(
'name' => 'Firefox On Linux', // имя, будет отображаться в сообщениях
'browser' => '*firefox', // браузер
'host' => 'localhost', // хост где запущен selenium-server
'port' => 4444, // порт
'timeout' => 30000, // таймаут
),
array
(
'name' => 'Konqueror On Linux',
'browser' => '*konqueror',
'host' => 'localhost',
'port' => 4444,
'timeout' => 30000,
),
array
(
'name' => 'Safari On Windows',
'browser' => '*custom C\Program Files\Safari\Safari.exe -url',
'host' => 'windows.machine',
'port' => 4444,
timeout => 30000,
)
// ...
);
}
Так же указать браузер можно в методе setUp используя метод setBrowser
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
class FirstTest extends PHPUnit_Extensions_SeleniumTestCase
{
public function setUp()
{
$this->setBrowser('*firefox');
}
}
Если в методе setUp устанавливается браузер, то это перекроет свойство $browsers. Если вы хотите чтобы использовался набор браузеров из свойства $browsers, то не используйте метод setBrowser.
В методе setUp следует указать начальный URL используя метод setBrowserUrl
public function setUp()
{
$this->setBrowserUrl('http//myproject.sf');
}
Вообще метод setUp используется для конфигурирования сессии Selenium RC. Для этого существует набор методов
public function setUp()
{
$this->setBrowser('*firefox'); // устанавливает браузер
$this->setBrowserUrl('http//myproject.sf'); // базовый URL
$this->setHost('localhost'); // хост где запущен selenium-server
$this->setPort(4444); // порт на котором висит selenium-server
$this->setTimeout(30000); // таймаут соединения с selenium-server
// кол-во секунд между командами отправляемыми Selenium RС
$this->setSleep(1);
}
Названия тестовых методов должны начинаться с test. Например:
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
class FirstTest extends PHPUnit_Extensions_SeleniumTestCase
{
// ...
public function testHomepage()
{
// ...
}
}
PHPUnit_Extensions_SeleniumTestCase реализует методы утверждений и действий. Например:
public function testHomepage()
{
$this->open('/'); // открыть корневой URL
$this->assertTitleEquals('My Project'); // утверждение title=My Project
}
Практически ко всем методам действий и утверждений доступных в Selenium RC можно обратиться как $this->methodName(). Список доступных методов см. ниже в тексте.
Так же используя PHPUnit_Extensions_SeleniumTestCase можно выполнять Selenese тесты. Это тесты написанные в HTML файлах, с расширением .htm. В таких файлах тесты пишутся в таблицах, из трех колонок:
- команда
- цель
- значение
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
class SeleneseTest extends PHPUnit_Extensions_SeleniumTestCase
{
// в этой директории рекурсивно будут искаться все файлы с расширением .htm
public static $seleneseDirectory = 'test/selenium/html';
}
Методы PHPUnit_Extensions_SeleniumTestCase
Таблица утверждений
Утверждение | Значение |
---|---|
assertAlertPresent | Уведомляет об ошибке если не представлен alert |
assertNoAlertPresent() | Уведомляет об ошибке если alert представлен. |
assertChecked(string $locator) | Уведомляет об ошибке, если элемент найденый по $locator не отмечен (checked) для checkbox и radiobutton. |
assertNotChecked(string $locator) | Противоположен предыдущему. |
assertConfirmationPresent() | Уведомляет об ошибке если подтверждение (confirm) не представлено. |
assertNoConfirmationPresent() | Противоположен предыдущему. |
assertEditable(string $locator) | Уведомляет об ошибке если элемент найденный по $locator не редактируем (editable). |
assertNotEditable(string $locator) | Противоположен предыдущему. |
assertElementValueEquals(string $locator, string $text) | Уведомляет об ошибке, если значение элемента найденного по $locator не эквивалентно переданному $text. |
assertElementValueNotEquals(string $locator, string $text) | Противоположен предыдущему. |
assertElementContainsText(string $locator, string $text) | Уведомляет об ошибке если элемент найденый по $locator не содержит текст переданный в $text. |
assertElementNotContainsText(string $locator, string $text) | Противоположен предыдущему. |
assertElementPresent(string $locator) | Уведомляет об ошибке если элемент найденный по $locator не представлен. |
assertElementNotPresent(string $locator) | Противоположен предыдущему. |
assertLocationEquals(string $location) | Уведомляет об ошибке если текущий "location" не эквивалентен переданному $location. |
assertLocationNotEquals(string $location) | Противоположен предыдущему. |
assertPromptPresent() | Уведомляет об ошибке если prompt не представлен. |
assertNoPromptPresent() | Противоположен предыдущему. |
assertSelectHasOption(string $selectLocator, string $option) | Уведомляет об ошибке если переданная опция не доступна. |
assertSelectNotHasOption(string $selectLocator, string $option) | Противоположен предыдущему. |
assertSelected($selectLocator, $option) | Уведомляет об ошибке если переданный элемент не выбран (select списки). |
assertNotSelected($selectLocator, $option) | Противоположен предыдущему. |
assertIsSelected(string $selectLocator, string $value) | Уведомляет об ошибке если в списке не выбран элемент с переданным значением (select списки). |
assertIsNotSelected(string $selectLocator, string $value) | Противоположен предыдущему. |
assertSomethingSelected(string $selectLocator) | Уведомляет об ошибке, если опция идентифицируемая как $selectLocator не выбрана. |
assertNothingSelected(string $selectLocator) | Противоположен предыдущему. |
assertTextPresent(string $pattern) | Уведомляет об ошибке, если не представлен текст соответствующий переданному $pattern. |
assertTextNotPresent(string $pattern) | Противоположен предыдущему. |
assertTitleEquals(string $title) | Уведомляет об ошибке если заголовок страницы (title) не соответствует переданному $title. |
assertTitleNotEquals(string $title) | Противоположен предыдущему. |
assertVisible(string $locator) | Уведомляет об ошибке если элемент найденный по $locator не виден (visible). |
assertNotVisible(string $locator) | Противоположен предыдущему. |
Доступные методы действий, более подробное описание:
- addLocationStrategy
- addSelection
- allowNativeXpath
- altKeyDown
- altKeyUp
- answerOnNextPrompt
- assignId
- break
- captureEntirePageScreenshot
- captureScreenshot
- check
- chooseCancelOnNextConfirmation
- chooseOkOnNextConfirmation
- click
- clickAt
- close
- contextMenu
- contextMenuAt
- controlKeyDown
- controlKeyUp
- createCookie
- deleteAllVisibleCookies
- deleteCookie
- doubleClick
- doubleClickAt
- dragAndDrop
- dragAndDropToObject
- dragDrop
- echo
- fireEvent
- focus
- goBack
- highlight
- ignoreAttributesWithoutValue
- keyDown
- keyPress
- keyUp
- metaKeyDown
- metaKeyUp
- mouseDown
- mouseDownAt
- mouseMove
- mouseMoveAt
- mouseOut
- mouseOver
- mouseUp
- mouseUpAt
- mouseUpRight
- mouseUpRightAt
- open
- openWindow
- pause
- refresh
- removeAllSelections
- removeSelection
- runScript
- select
- selectFrame
- selectWindow
- setBrowserLogLevel
- setContext
- setCursorPosition
- setMouseSpeed
- setSpeed
- shiftKeyDown
- shiftKeyUp
- store
- storeAlert
- storeAlertPresent
- storeAllButtons
- storeAllFields
- storeAllLinks
- storeAllWindowIds
- storeAllWindowNames
- storeAllWindowTitles
- storeAttribute
- storeAttributeFromAllWindows
- storeBodyText
- storeChecked
- storeConfirmation
- storeConfirmationPresent
- storeCookie
- storeCookieByName
- storeCookiePresent
- storeCursorPosition
- storeEditable
- storeElementHeight
- storeElementIndex
- storeElementPositionLeft
- storeElementPositionTop
- storeElementPresent
- storeElementWidth
- storeEval
- storeExpression
- storeHtmlSource
- storeLocation
- storeMouseSpeed
- storeOrdered
- storePrompt
- storePromptPresent
- storeSelectOptions
- storeSelectedId
- storeSelectedIds
- storeSelectedIndex
- storeSelectedIndexes
- storeSelectedLabel
- storeSelectedLabels
- storeSelectedValue
- storeSelectedValues
- storeSomethingSelected
- storeSpeed
- storeTable
- storeText
- storeTextPresent
- storeTitle
- storeValue
- storeVisible
- storeWhetherThisFrameMatchFrameExpression
- storeWhetherThisWindowMatchWindowExpression
- storeXpathCount
- submit
- type
- typeKeys
- uncheck
- windowFocus
- windowMaximize