如何在运行时提取Selenium Web元素的识别策略?

时间:2015-11-18 21:27:55

标签: java selenium

我遇到的问题是我的Page Object类找到屏幕上的所有对象,然后将其发送到更通用的方法来进行实际的数据输入。在这个数据输入过程中,一些对象变得陈旧,我得到了#34; StaleElementException"。

我的计划是捕获该异常并尝试再次重新找到该元素。

是否有一种从运行时WebElement对象中提取选择策略的方法,而不是执行" object.toString()"然后解析它?

1 个答案:

答案 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更清晰,更清晰地提供给消费者(您和其他脚本编写者)。