我开始使用PageFactory框架并开始使用@FindBy
而不太了解它,除了阅读这是一个高级方法。
我意识到ExpectedConditions.presenceOfElementLocated
不适用于WebElements
。所以我不得不使用不同的.visibilityOf
,有时它不会对我的元素执行操作。
因此我将其更改为By方法,现在定位器再次完美运行。
By
类是否更适合存储元素?
哪个问题容易发生? @Findby
或By
答案 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();
}