WebDriver / 将元素读入变量并重新使用它们

Or *_*ith 3 selenium

我对(Selenium 2)有一个大问题Webdriver

在我的测试代码中,我找到测试开始时的所有元素,并对它们执行一些操作(例如click()、检查属性等)。我的问题是我的页面刷新并重新加载我的元素,而 Webdriver 不知道再次识别这些元素。

我知道我可以再次找到我的元素,但在某些函数中我不知道我的 XPath/ids,并且我只得到 WebElements,而不是 XPath/ID。

我说的对吗?不可能将元素读入变量并重新使用它们?

Bud*_*dha 5

WebElement element = driver.findElement(By.id("xyz"));
Run Code Online (Sandbox Code Playgroud)

上面的行将把元素对象存储在element变量中。您当然可以将此元素传递给其他函数以在那里使用它。

我们通常遵循页面对象设计模式,将页面的所有对象创建为类的成员并立即实例化它们。这样我们就可以在项目中的任何地方使用它们。例如,登录页面中的所有对象都将在名为 的类中创建为公共静态变量LoginPage。类的构造函数LoginPage将查找元素并存储它们。

下次您想要访问 的对象时LoginPage,我们将按如下方式访问它们(假设您已经创建了元素userNamesubmit)...

LoginPage.userName.sendKeys("buddha");
LoginPage.submit.click();
Run Code Online (Sandbox Code Playgroud)

然而,正如 Robbie 提到的,页面刷新后,使用先前创建的对象有可能无法访问这些对象。您可以使用以下修改后的方法来确保始终找到这些对象。

不要将对象创建为成员变量,而是为您可能需要使用的每个对象创建一个get 方法。

class LoginPage
{
    public static WebElement getUserName()
    {
         return driver.findElement(By.id("xyz"));
    }
}
Run Code Online (Sandbox Code Playgroud)

一旦LoginPage以这种方式定义,下次您想使用 时userName,您可以使用以下语法。这样您就不必为需要使用这些对象的函数提供定位器。

LoginPage.getUserName().sendKeys("buddha");
Run Code Online (Sandbox Code Playgroud)

通过使用这种方法,您可以确保对象始终可访问。