@Findby vs. 优缺点?

@Findby vs. By cons and pros?

我启动了一个 PageFactory 框架并开始使用 @FindBy 除了阅读这是一种高级方法之外,我对它的了解并不多。

我发现 ExpectedConditions.presenceOfElementLocated 不适用于 WebElements。所以我不得不使用 .visibilityOf 这是不一样的,有时它不会对我的元素执行操作。

所以我将其更改为 By 方法,现在定位器再次正常工作。

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

哪个更不容易出问题? @FindbyBy

@FindBy 属性对静态元素很有帮助。未动态加载的元素可以使用 @FindBy 属性以更清晰的方式轻松映射。您正在使用 Expected conditions 因为元素不会立即加载并且 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#代码

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

有注释

@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();
}