Я не уверен, нужна ли эта преамбула (полностью или вообще), но я думаю, что она передает мой вариант использования необходимости использования нестатического поля внутри статического метода расширения.
У меня есть набор тестов, реализованный с помощью Selenium/C#/NUnit.
Раньше я использовал PageFactory для определения элементов моей страницы. PageFactory устарел, поэтому было логично переключиться на определение моих элементов как IWebElements:
Домашняя страница.cs...
IWebElement UsernameTextBox = driver.FindElement(By.Id("username"));
IWebElement PasswordTextBox = driver.FindElement(By.Id("password"));
IWebElement LoginButton = driver.FindElement(By.Id("login"));
Проблема с этим подходом заключается в том, что перед выполнением любых тестов этот файл считывается, строка за строкой, и запрашивается DOM для всех этих элементов, прежде чем мои тесты попытаются их использовать. Они генерируют исключения ElementNotFound, потому что, конечно же, во время запроса элементов тест еще не был запущен, а это означает, что мы даже не находимся на домашней странице, чтобы взаимодействовать с ними.
Чтобы решить эту проблему, я изменил тип элементов на By:
Домашняя страница.cs...
By UsernameTextBox = By.Id("username");
By PasswordTextBox = By.Id("password");
By LoginButton = By.Id("login");
Это позволяет мне определять элементы, а затем запрашивать DOM в нужное время. Отлично, проблема решена. Только теперь у меня другая проблема. Мне понравилась возможность связывать методы с IWebElements для удобства чтения:
LoginButton.Click();
Но тип 'By' не содержит методов, которые есть у IWebElement. Итак, следующий логический шаг: создайте метод расширения.
public static class ByExtensionMethods {
public static void Click(this By elementLocator) {
driver.FindElement(elementLocator);
}
}
Отлично, проблема решена. Только теперь у меня другая проблема. Мой набор тестов не может использовать статический IWebDriver, потому что я хочу выполнять свои тесты параллельно. К сожалению, метод расширения требует, чтобы драйвер был статическим.
Поэтому, если я не смогу каким-то образом использовать свой нестатический IWebDriver внутри метода расширения, похоже, я не могу достичь своей цели по цепочке методов из элементов "By"...
LoginButton.Click(driver);
- person DavidG   schedule 31.01.2020