我遇到的问题是我的Page Object类找到屏幕上的所有对象,然后将其发送到更通用的方法来进行实际的数据输入。在这个数据输入过程中,一些对象变得陈旧,我得到了#34; StaleElementException"。
我的计划是捕获该异常并尝试再次重新找到该元素。
是否有一种从运行时WebElement对象中提取选择策略的方法,而不是执行" object.toString()"然后解析它?
答案 0 :(得分:1)
我通过定义类顶部的定位器,然后是验证我们是否在右页(等)的构造函数,然后是页面上可用的每个操作的方法来使用页面对象。以下是Google搜索页面的一个简单示例。
GoogleSearchPage.java
public class GoogleSearchPage
{
private WebDriver driver;
private By waitForLocator = By.id("lst-ib"); // optional
private By searchBoxLocator = By.id("lst-ib");
private By searchButtonLocator = By.cssSelector("button[name='btnG']");
private By feelingLuckyButtonLocator = By.id("gbqfbb");
public GoogleSearchPage(WebDriver webDriver)
{
driver = webDriver;
// wait for page to finish loading
new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(waitForLocator));
// see if we're on the right page
if (!driver.getCurrentUrl().contains("https://www.google.com"))
{
throw new IllegalStateException("This is not the Google search page. Current URL: " + driver.getCurrentUrl());
}
}
public void doSearch(String searchString)
{
driver.findElement(searchBoxLocator).sendKeys(searchString);
driver.findElement(searchButtonLocator).click();
}
}
GoogleSearchTest.java
public class GoogleSearchTest
{
public static void main(String[] args)
{
WebDriver driver = new FirefoxDriver();
driver.get("http://www.google.com");
GoogleSearchPage googleSearchPage = new GoogleSearchPage(driver);
googleSearchPage.doSearch("selenium");
System.out.println(driver.getCurrentUrl().contains("#q=selenium"));
}
}
这显然是一个非常简单的示例,但它显示了一种创建页面对象的好方法,它可以显着降低StaleElementExceptions的频率,并且在某些情况下,可以加快脚本执行速度,因为您只需要抓取所需内容并继续前进。
减少为页面上的每个元素提供getX()
和clickX()
方法的冲动。而是支持基于任务的方法。问问自己用户想要在页面上完成哪些任务,并提供执行这些任务的方法。它将使您的页面对象API更清晰,更清晰地提供给消费者(您和其他脚本编写者)。