@Findby vs. 优缺点?
@Findby vs. By cons and pros?
我启动了一个 PageFactory 框架并开始使用 @FindBy
除了阅读这是一种高级方法之外,我对它的了解并不多。
我发现 ExpectedConditions.presenceOfElementLocated
不适用于 WebElements
。所以我不得不使用 .visibilityOf
这是不一样的,有时它不会对我的元素执行操作。
所以我将其更改为 By 方法,现在定位器再次正常工作。
By
class 是否更适合存储元素?
哪个更不容易出问题? @Findby
或 By
@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();
}
我启动了一个 PageFactory 框架并开始使用 @FindBy
除了阅读这是一种高级方法之外,我对它的了解并不多。
我发现 ExpectedConditions.presenceOfElementLocated
不适用于 WebElements
。所以我不得不使用 .visibilityOf
这是不一样的,有时它不会对我的元素执行操作。
所以我将其更改为 By 方法,现在定位器再次正常工作。
By
class 是否更适合存储元素?
哪个更不容易出问题? @Findby
或 By
@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();
}