【问题标题】:How to find elements dynamically in selenium如何在硒中动态查找元素
【发布时间】:2019-05-16 02:02:04
【问题描述】:

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

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

【问题讨论】:

标签: java selenium


【解决方案1】:

很简单,在你的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);

我个人喜欢把 pageObject 中的 driver.findElement 方法作为 lambda 表达式,避免重写代码:

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

【讨论】:

  • 谢谢 Valga,我可以请你举例说明你的意思吗? '我个人喜欢把 driver.findElement 方法作为 lambda 表达式放在 pageObject 中,以避免重写代码,但每个人都有自己的!'
  • @BruceyBandit 抱歉,现在我又读了一遍,听起来很糟糕,但我并没有任何不好的意思,我用我的 selenium 脚本编码方式编辑了答案
猜你喜欢
  • 1970-01-01
  • 2017-07-05
  • 1970-01-01
  • 2021-04-27
  • 2021-11-26
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 2021-05-07
相关资源
最近更新 更多