@Findby vs.比利时和专业人士?

时间:2015-04-28 21:54:09

标签: java selenium-webdriver factory-pattern

我开始使用PageFactory框架并开始使用@FindBy而不太了解它,除了阅读这是一个高级方法。

我意识到ExpectedConditions.presenceOfElementLocated不适用于WebElements。所以我不得不使用不同的.visibilityOf,有时它不会对我的元素执行操作。

因此我将其更改为By方法,现在定位器再次完美运行。

By类是否更适合存储元素?

哪个问题容易发生? @FindbyBy

2 个答案:

答案 0 :(得分:2)

@FindBy属性对静态元素非常有用。可以使用@FindBy属性以更干净的方式轻松映射未动态加载的元素。您正在使用预期条件,因为元素未立即加载,Selenium需要等待元素加载或定期检查它是否存在。在这种情况下,@FindBy无效,您必须使用By选择器。在这种情况下,我创建私有字段以减少代码重复。 据我所知,在页面对象模式中使用@FindBy是一种更清晰的元素映射方式,这种方式在每个场景中都无法使用,这是使用它的唯一好处。

私有字段如何用于元素映射的示例

private static readonly By TestSelector = By.XPath("Your xpath");

public void ClickUpdate()
{
    //Use same selector/field
    Driver.FindElement(TestSelector).Click();
}

public void ClickUpdate2()
{
    //Use same selector/field
    Driver.FindElement(TestSelector).Click();    
}

注意:C#代码

答案 1 :(得分:0)

我刚做了两个例子。首先是注释,第二个没有。 有区别。如果页面的构造函数被称为PageFactory.initElements(driver,this);,它将检查页面上的所有元素。如果其中一些不存在,则无论该元素是否是给定测试所必需的,它都会失败(动态页面)。下一个问题是失败的测试。它不容易识别它失败的地方。它显示了页面,但堆栈跟踪的确切位置不存在。 在第二个示例中,您可以轻松找到失败的方法(位置)。而且,除非调用缺少/错误的元素,否则未调用且可能丢失的元素不会导致测试失败。

带注释

@FindBy(id = "lst-ib")
private WebElement searchField;

@FindBy(css = "input[name=\"btnK\"]")
private WebElement searchButton;

且没有

private static final String SEARCH_FIELD_ID = "lst-ib";
private static final String SEARCH_BUTTON_CSS = "input[name=\"btnK\"]";

在第一个例子中,它更容易被称为。

public void clickToSearchButton(){
searchButton.click();
}

而在第二个例子中:

public void clickToSearchButton(){
driver.findElement(By.cssSelector(SEARCH_BUTTON_CSS)).click();
}