Я использую Pester с Selenium WebDriver. WebDriver инициализируется в блоке BeforeAll в соответствующем блоке Describe, а результирующий экземпляр назначается переменной $ driver. Затем в блоках «Описание» и «Оно» я вызываю свои пользовательские функции, которые находятся во внешнем модуле PowerShell, который автоматически загружается с помощью PowerShell. Я ожидаю, что эти функции имеют доступ к переменной $ driver, определенной в блоке BeforeAll, но этого не происходит, и я получаю следующее сообщение об ошибке:
RuntimeException: нельзя вызвать метод для выражения с нулевым значением.
Вот код из скрипта Search.Tests.ps1 Pester:
Describe "Search for something" -Tag something {
BeforeAll {
$driver = New-WebDriver
$driver.Navigate().GoToUrl('http://example.com')
}
AfterAll {
$driver.Close()
$driver.Dispose()
$driver.Quit()
}
Find-WebElement -Selector ('some_selector')
It "Something is found in search results" {
GetTextFrom-WebElement -Selector ('some_selector') | Should Be 'something'
}
}
Find-WebElement и GetTextFrom-WebElement - это вспомогательные функции, которые используют $ driver для получения элемента с помощью CSS и извлечения внутреннего текста элемента.
Я изучил проблему и нашел обходной путь, но не думаю, что это элегантный способ. Обходной путь - переопределить $ driver в каждой вспомогательной функции во внешнем модуле PowerShell сразу после блока параметров следующим образом:
$driver = $PSCmdlet.GetVariableValue('driver')
Таким образом, функции могут видеть $ driver и все работает.
Мой вопрос: можно ли что-то сделать, чтобы функции всегда имели доступ к $ driver без необходимости переопределять драйвер в каждой из них?
$driver
вне блокаDescribe
, чтобы изменить его область действия. - person Eris   schedule 03.09.2016$driver = $null
снаружи, тогда инициализируйте его. Я также рекомендуюSet-Strictmode -Version latest
, чтобы избежать неопределенных переменных. - person Eris   schedule 03.09.2016