Я не уверен, нужна ли эта преамбула (полностью или вообще), но я думаю, что она передает мой сценарий использования для необходимости использования нестатического поля c внутри метода расширения stati c .
У меня есть набор тестов, реализованный с помощью Selenium / C # / NUnit.
Я использовал PageFactory для определения элементов моей страницы. PageFactory устарела, поэтому было логично перейти к определению моих элементов как IWebElements:
HomePage.cs ...
IWebElement UsernameTextBox = driver.FindElement(By.Id("username"));
IWebElement PasswordTextBox = driver.FindElement(By.Id("password"));
IWebElement LoginButton = driver.FindElement(By.Id("login"));
Проблема с этим подходом заключается в том, что до начала любых тестов run, этот файл читается построчно, и DOM запрашивает все эти элементы, прежде чем мои тесты попытаются их использовать. Они генерируют исключения ElementNotFound, потому что, конечно же, на момент запроса элементов еще не было выполнено ни одного теста, что означает, что мы даже не на главной странице, чтобы взаимодействовать с ними.
Чтобы решить эту проблему, Я изменил тип элементов на By:
HomePage.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);
}
}
Отлично, проблема решена. За исключением того, что теперь у меня есть другая проблема. Мой набор тестов не может использовать stati c IWebDriver, потому что я хочу выполнять свои тесты параллельно. К сожалению, подход метода расширения требует, чтобы драйвер был stati c.
Так что, если я не могу каким-то образом использовать свой не-stati c IWebDriver внутри метода расширения, похоже, что я не могу достичь своей цели методы сцепления от элементов 'By' ...