0

我想通过一个导航器对象而不是直接调用很多页面对象来调用所有方法。

导航器模式的存在是为了在之前或之后做一些额外的事情,甚至代替将他的方法传递给 Page Objects

所以,我找到了如何在 C# 中实现 Navigator 模式(它使用委托),但是我的项目用 Java 和所有 selenium 自动化测试框架(它使用 Selenium、Java 和 Testng)编写的也必须如此。

如何用 Java 编写以下代码(导航器模式)?(Java 中没有委托功能)。

导航界面:

public interface INavigator
{
  TT Open<tt>() where TT : PageBase, new();
  TT Navigate<tt>(Action action) where TT : PageBase, new();

  void ClickAndWaitForText(Action action, string text);
 ...
}
}

navigator 的用法是这样的:

[TestFixture]
 public class LoginTest
  {
      private SeleniumScope _scope;
      private INavigator _navigator;

      [TestFixtureSetUp]
      public void Setup()
      {
          _scope = new SeleniumScope();
          _navigator = new Navigator(_scope.Selenium);
      }
      [Test]
      public void Login()
      {
          var login = _navigator.Open<LoginPage>();
          login.User.SetText("admin");
          login.Password.SetText("god");
          _navigator.Navigate<HomePage>(login.ClickLogin);
      }

PS 如您所见,它在 C# 中看起来不错,但是如何在 java 中编写 Navigator 模式?

但是如何在java中正确实现导航器模式呢?例如 _navigator.Navigate(login.ClickLogin);。_navigator 必须在为正确的对象“HomePage”执行传递的方法“login.ClickLogin”之前处理(比如添加 waitFor() 或其他东西)。与 C# 不同,Java 没有委托功能。

4

1 回答 1

0

设计这个与 Selenium 关系不大,您可以将良好的 Java 设计实践应用到这个问题上。例如,声明一个接口,该接口定义了一个接受一个参数(Selenium 对象 DesiredCapabilities)的方法(runTest)。在每个 Selenium 测试类上,实现接口并将测试代码放在那里。现在在您的“导航器”类中,注册测试类。您的“导航器”类将遍历这些注册的测试用例并调用runTest它们。

实际上,有一个更好的方法可以做到这一点。使用 JUnit 并将每个 Selenium 测试类声明为 extendsTestCase这是一个 JUnit 类。在您的导航器类中,实现以下代码:

public static Test tests() {
   //FirstTest, SecondTest, and ThirdTest extend TestCase
   TestSuite suite = new TestSuite();
   suite.addTestSuite(FirstTest.class);
   suite.addTestSuite(SecondTest.class);
   suite.addTestSuite(ThirdTest.class);
   return suite;
}

然后运行测试把它放在 Navigator 类的 main 方法中:

public static void main(String[] args) {
    junit.textui.TestRunner.run(tests());
}

作为你的FirstTest.class样子的一个例子:

@Test
public void testSomething() throws Exception {
   for (DesiredCapabilities capability : SeleniumUtil.getCapabilities()){
      runSeleniumTest(capability);
   }
}

上面的示例与您的类执行相同的Navigator操作,只是它更简单并且可以作为任何 Selenium JUnit 测试的模式。

于 2013-11-06T21:21:41.747 回答