Selenium PageFactory惰性求值



我正在一个系统上做单元测试,使用Selenium和页面对象模型。

通常我能在相对较短的时间内找到解决这类问题的方法,但这个问题太棘手了,所以我想我应该把问题的根源弄清楚,而不是再写一个变通方法。

有一个PageObject类,它有一个IWebElement属性和必要的FindsBy属性来定位页面上的元素,还有一个方法使用该属性:

public class Foo : BasePage
{

...

[FindsBy(How = How.XPath, Using = "//a[@title='Edit']")]
protected IWebElement LinkEdit { get; set; }

...

public Bar ClickEdit()
{
WaitUntilInteractable(LinkEdit);
LinkEdit.Click();

return new Bar(driver);
}

...

}

注意这是对LinkEdit

的唯一引用为清楚起见,BasePage中将WaitUntilInteractable定义为:

protected void WaitUntilInteractable(IWebElement webElement)
{
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
_ = wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(webElement));
}

我对PageFactory如何与Selenium一起工作的理解是,每当您引用类的IWebElement属性时,IWebDriver将在页面内找到该元素。

本页内容如下:https://github.com/seleniumhq/selenium/wiki/pagefactory

…每次我们在WebElement上调用一个方法时,驱动程序都会再次在当前页面上找到它。

考虑到这些知识,我不太明白当我简单地引用这些属性之一时,我怎么能遇到StaleElementReferenceException。当然,要么找不到元素,在这种情况下将抛出NoSuchElementException,要么可以找到元素,在这种情况下,它出现在文档中,而不是"过期"

也许我误解了陈腐。

当引用的元素不再附加到HTML文档中时,会发生StaleElementException。这可以在非常短的时间内发生,并且通常在JavaScript更新页面时发生。更令人沮丧的是,WebDriverWait对象并没有捕捉到StaleElementException,而是继续等待。你必须告诉WebDriverWait忽略这些异常:

protected void WaitUntilInteractable(IWebElement webElement)
{
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
wait.IgnoreExceptionTypes(typeof(StaleElementException));
wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(webElement));
}

现在,当webElement失效时,它会重新尝试操作,直到等待对象超时。

相关内容

  • 没有找到相关文章

最新更新