如何在硒中动态查找元素

时间:2019-05-15 16:36:05

标签: java selenium

当前在我的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);

解决这种情况的最佳方法是什么?我真的不想继续对元素进行硬编码,而是更好地使用已经在元素列表中定义的元素。

1 个答案:

答案 0 :(得分:1)

简单,在pageObject中将它们声明为By:

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方法作为lambda表达式放在pageObject中,以避免重写代码:

我在C#上做什么:

public IWebElement Test => webdriver.FindElement(By.CssSelector("test"));

转换为Java:

public WebElement test -> driver.findElement(By.cssSelector("test"));

因此,编写我的代码将是这样的:

page.Test.Click();
page.Test.SendKeys("...");

由于我不喜欢在Test类中使用元素,因此我将这些方法写在pageobject中(从脚本中分离测试逻辑),例如:

    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();