每页中的文本检查(Selenium)
Text check in every page (Selenium)
使用 Java,我正在尝试对现有测试访问的 Web 应用程序中每个页面上的特定文本编写一般检查。不必在每一页上单独写它,是否可以在一个较高级别的地方(可能在基础class)做?
public class BaseClassForUiTest {
public BaseClassForUiTest() {
...
}
public void test() throws Exception {
boolean isNewPage = checkIfNewPage();
if (isNewPage)
// perform a text check on the page
}
}
每个测试都从 BaseClassForUiTest
扩展并覆盖 test()
方法。
至于我,你最好使用 Parameterized or JUnitParams 为这个检查创建一个单独的测试 class 并给它一个指向 运行 的 url 作为参数,但这取决于您 运行ning 测试的常用方法是什么(我们同时 运行 所有测试包,因此在这种情况下它是我们的解决方案)。
这似乎也是逻辑上分离的解决方案
如果您打算将此检查用作断言,您可以为这种情况重写当前代码并在 @Before 块中调用它(但在我看来这仍然不是一个好的解决方案)
Instead of having to write it on each and every page individually, is it possible to do in one place at a high level (may be in the base class)?
是的,可以通过将 WebDriverEventListener
实现到 BaseClassForUiTest
并重写事件处理程序方法以根据需要在一个地方处理适当的 WebDriver
事件。
Here每个方法对应一个事件。根据您的要求,您需要处理 afterNavigateTo()
方法。每次导航到页面完成时都会调用此方法。
您必须在此方法中对页面代码执行文本检查,以便每次页面导航到其他页面时都执行您的代码。
public class BaseClassForUiTest implements WebDriverEventListener
{
---------
---------
public void afterNavigateTo(String arg0, WebDriver arg1) {
// perform desire text checker stuff on the page here
}
}
现在创建事件抛出 WebDriver 来执行您的测试 :-
创建一个常规的 WebDriver。
FirefoxDriver driver = new FirefoxDriver();
现在使用上面创建的常规 WebDriver
创建一个 EventThrowingWebDriver
。
EventFiringWebDriver eventDriver = new EventFiringWebDriver(driver);
创建一个 eventHandler
class 的实例,并使用上面创建的 EventFiringWebDriver
对象的注册方法为事件注册它:-
BaseClassForUiTest handler = new BaseClassForUiTest();
eventDriver.register(handler);
完整代码:-
import org.openqa.selenium.support.events.EventFiringWebDriver;
public class BaseClassForUiTest {
public void test() throws Exception {
FirefoxDriver driver = new FirefoxDriver();
EventFiringWebDriver eventDriver = new EventFiringWebDriver(driver);
BaseClassForUiTest handler = new BaseClassForUiTest();
eventDriver.register(handler);
eventDriver.get("your url");
//Now do your further stuff
}
}
使用 Java,我正在尝试对现有测试访问的 Web 应用程序中每个页面上的特定文本编写一般检查。不必在每一页上单独写它,是否可以在一个较高级别的地方(可能在基础class)做?
public class BaseClassForUiTest {
public BaseClassForUiTest() {
...
}
public void test() throws Exception {
boolean isNewPage = checkIfNewPage();
if (isNewPage)
// perform a text check on the page
}
}
每个测试都从 BaseClassForUiTest
扩展并覆盖 test()
方法。
至于我,你最好使用 Parameterized or JUnitParams 为这个检查创建一个单独的测试 class 并给它一个指向 运行 的 url 作为参数,但这取决于您 运行ning 测试的常用方法是什么(我们同时 运行 所有测试包,因此在这种情况下它是我们的解决方案)。 这似乎也是逻辑上分离的解决方案
如果您打算将此检查用作断言,您可以为这种情况重写当前代码并在 @Before 块中调用它(但在我看来这仍然不是一个好的解决方案)
Instead of having to write it on each and every page individually, is it possible to do in one place at a high level (may be in the base class)?
是的,可以通过将 WebDriverEventListener
实现到 BaseClassForUiTest
并重写事件处理程序方法以根据需要在一个地方处理适当的 WebDriver
事件。
Here每个方法对应一个事件。根据您的要求,您需要处理 afterNavigateTo()
方法。每次导航到页面完成时都会调用此方法。
您必须在此方法中对页面代码执行文本检查,以便每次页面导航到其他页面时都执行您的代码。
public class BaseClassForUiTest implements WebDriverEventListener
{
---------
---------
public void afterNavigateTo(String arg0, WebDriver arg1) {
// perform desire text checker stuff on the page here
}
}
现在创建事件抛出 WebDriver 来执行您的测试 :-
创建一个常规的 WebDriver。
FirefoxDriver driver = new FirefoxDriver();
现在使用上面创建的常规
WebDriver
创建一个EventThrowingWebDriver
。EventFiringWebDriver eventDriver = new EventFiringWebDriver(driver);
创建一个
eventHandler
class 的实例,并使用上面创建的EventFiringWebDriver
对象的注册方法为事件注册它:-BaseClassForUiTest handler = new BaseClassForUiTest(); eventDriver.register(handler);
完整代码:-
import org.openqa.selenium.support.events.EventFiringWebDriver;
public class BaseClassForUiTest {
public void test() throws Exception {
FirefoxDriver driver = new FirefoxDriver();
EventFiringWebDriver eventDriver = new EventFiringWebDriver(driver);
BaseClassForUiTest handler = new BaseClassForUiTest();
eventDriver.register(handler);
eventDriver.get("your url");
//Now do your further stuff
}
}