java - 如何在硒中动态查找元素
问题描述
目前在我的 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);
我个人喜欢将 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();
推荐阅读
- c# - 如何使用公钥加密字符串并使用 MimeKit 使用私钥解密?
- flutter - 有没有办法在手机锁定时保持计时器运行?
- python - 弗劳恩霍夫衍射——可能转移 fft2 问题
- python-3.x - 在 matplotlib 中添加从另一个库生成的图像作为插图
- tensorflow - 'conda install tensorflow-gpu' 没有安装任何 CUDNN 库
- java - Java:: 进程构建器:bash 脚本:返回的文件名是正确的,但 fileReader 抛出 FileNotFoundException
- java - 将16BitPCM转为.wav,切换字节序后,.wav文件向后播放
- neo4j - 有没有办法在密码查询中进行计算?
- matplotlib - 简单的matplotlib作为flask生成的网页中的嵌入图像
- postgresql - 通过从远程客户端连接的 psql 使用多个 sql 查询