找不到任何元素的Page Object Pattern和driver.findElements

时间:2018-03-09 12:15:41

标签: java selenium selenium-webdriver pageobjects

从wiki文档https://github.com/SeleniumHQ/selenium/wiki/PageFactory我发现,如果脚本使用例如。发现了一些内容 @FindBy(id = "q") WebElement q;

句子:

 q.sendKeys(text);

相当于:

driver.findElement(By.id("q")).sendKeys(text);

但是如何在POM中使用Annotation:

driver.findElements(By.id("q")).isEmpty() ?

目前我只使用纯Selenium winthout Annotation,例如

 if(!driver.findElements(By.id("q")).isEmpty()) {
    q.click }

当然,我可以使用try / cath,但是在POM中应该有一些注释用于' findElement s '。

2 个答案:

答案 0 :(得分:2)

你要求的不是Selenium WebDriver。这是Java。

isEmpty()方法属于List接口。调用List方法后返回findElements()

如果您想使用@FindBy并检查List是否为空,请执行以下操作:

@FindBy(id = "q")
WebElement element;

@FindBy(id = "q")
List<WebElement> listOfElements;

public void someMethod() {
    //can't use `isEmpty()` on `element` because it's NOT a list
    listOfElements.isEmpty(); //that's how you can use it
}

答案 1 :(得分:1)

根据要使用 PageFactory The PageFactory Documentation,您需要在 PageObject 上声明一些 WebElement 的字段或列表,例如:

  • WebElement

    @FindBy(how = How.ID, using = "foobar") WebElement foobar;
    
  • List<WebElement>

    @FindBy(how = How.TAG_NAME, using = "a") List<WebElement> links;
    

因此 PageFactory 设计基于我们必须声明变量的原理,而PageFactory将在页面上搜索与该类中WebElement的字段名称匹配的元素。它通过首先查找具有匹配的定位器策略的元素来实现此目的。

因此,要按照driver.findElements(By.id("q")).isEmpty()在POM中实现 @FindBy 注释,您可以使用以下代码块:

@FindBy(how = How.TAG_NAME, using = "a") List<WebElement> links;

public void myFunction() 
{
    if(!links.isEmpty()) 
    {
        for(WebElement ele:links)
            ele.click();
    }
}