Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在selenium中动态查找元素_Java_Selenium - Fatal编程技术网

Java 如何在selenium中动态查找元素

Java 如何在selenium中动态查找元素,java,selenium,Java,Selenium,目前在我的firefox驱动程序中,如果我想找到一个元素,我会这样编写代码: WebDriver firefoxDriver = new FirefoxDriver(); ... firefoxDriver.findElement(By.id("testid")).isDisplayed(); or firefoxDriver.findElement(By.name("testname")).isDisplayed(); or firefoxDriver.findElement(By

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

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

简单,在您的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#上做什么:

转换为Java:

public WebElement test -> driver.findElement(By.cssSelector("test"));
因此,编写我的代码应该是这样的:

page.Test.Click();
page.Test.SendKeys("...");
PageObjectClassExample page = new PageObjectClassExample();
page
    .ShowFilters()
    .ClearAllFilters()
    .HideShowIssuerColumn();
由于我不喜欢在测试类中使用元素,我在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;
    }
在测试文件中,我会这样写:

page.Test.Click();
page.Test.SendKeys("...");
PageObjectClassExample page = new PageObjectClassExample();
page
    .ShowFilters()
    .ClearAllFilters()
    .HideShowIssuerColumn();

这是阿尔雷迪回答的。请看这里:可能重复的你不必找到元素,它们已经找到了。。。这就是
testedelement
,其他的是,
WebElement
s。只需使用
testedelement.click()
,等等。谢谢你,瓦尔加,我能请你举个例子说明你的意思吗?”我个人喜欢将driver.findElement方法作为lambda表达式放在pageObject中,以避免重写代码,但每个方法都有自己的用法@很抱歉,现在我又读了一遍,它听起来很糟糕,但我并不是说它有什么不好的地方,我用编写selenium脚本的方式编辑了答案