В настоящее время в моем драйвере Firefox, если я хочу найти элемент, я пишу код так:
WebDriver firefoxDriver = new FirefoxDriver();
...
firefoxDriver.findElement(By.id("testid")).isDisplayed();
or
firefoxDriver.findElement(By.name("testname")).isDisplayed();
or
firefoxDriver.findElement(By.class("testclass")).isDisplayed();
etc
Однако у меня есть эти элементы на отдельной странице, например:
@FindBy(id = "testid")
public WebElement testIdElement;
@FindBy(name = "testname")
public WebElement testNameElement;
@FindBy(class = "testclass")
public WebElement testClassElement;
Я хочу искать свои элементы, как показано ниже, но ниже не работает, потому что он ожидает By:
firefoxDriver.findElement(elementsPage.testIdElement);
or
firefoxDriver.findElement(elementsPage.testNameElement);
or
firefoxDriver.findElement(elementsPage.testClassElement);
Каков будет лучший способ справиться с этим сценарием? Я действительно не хочу жестко кодировать элементы, вместо этого лучше использовать элементы, которые я уже определил в своем списке элементов.
Возможный дубликат Селен @FindBy против driver.findElement()
Вам не нужно искать элементы, они уже найдены... это то, что testIdElement и другие, WebElements. Просто используйте такие, как testIdElement.click() и т. д.




Просто объявите их как By, как это в вашем pageObject:
public By testIdElement = By.id("testid");
public By testNameElement = By.name("testname");
public By testClassElement = By.className("testclass");
затем вызовите их в методе findelements так, как вы хотите:
firefoxDriver.findElement(elementsPage.testIdElement);
firefoxDriver.findElement(elementsPage.testNameElement);
firefoxDriver.findElement(elementsPage.testClassElement);
лично мне нравится помещать метод driver.findElement в pageObject как лямбда-выражение, чтобы избежать переписывания кода:
что я делаю на С#:
public IWebElement Test => webdriver.FindElement(By.CssSelector("test"));
преобразование в Java:
public WebElement test -> driver.findElement(By.cssSelector("test"));
поэтому написание моего кода будет примерно таким:
page.Test.Click();
page.Test.SendKeys("...");
Поскольку мне не нравится использовать элементы в классе Test, я пишу эти методы в объекте страницы (отделяя логику теста от скрипта), например:
public PageObjectClassExample ShowFilters()
{
showFiltersButton.Click();
return this;
}
public PageObjectClassExample ClearAllFilters()
{
finalDatePicker.Clear();
initialDatePicker.Clear();
searchButton.Click();
return this;
}
public PageObjectClassExample HideShowIssuerColunm()
{
ShowHideColumnBtn.Click();
IssuerColumnCheck.Click();
KeyColumnCheck.Click();
ShowHideColumnBtn.Click();
return this;
}
и в тестовом файле я бы написал что-то вроде этого:
PageObjectClassExample page = new PageObjectClassExample();
page
.ShowFilters()
.ClearAllFilters()
.HideShowIssuerColumn();
Спасибо, Валга, могу я попросить вас показать пример того, что вы подразумеваете под этим, пожалуйста? «Мне лично нравится помещать метод driver.findElement в pageObject как лямбда-выражение, чтобы избежать переписывания кода, но каждый по-своему!»
@BruceyBandit Извините, теперь, когда я прочитал это снова, это звучало плохо, но я не имел в виду ничего плохого, я отредактировал ответ, указав, как я кодирую свои селеновые скрипты.
На это уже ответили. Пожалуйста, посмотрите здесь: stackoverflow.com/questions/18436102/…