【问题标题】:Checking page status programmatically以编程方式检查页面状态
【发布时间】:2012-04-10 19:51:41
【问题描述】:

我一直在为 Web 应用程序编写 Selenium 测试,如果出现内部服务器错误,应用程序中似乎有多个内部服务器错误实例,应用程序显示自定义错误页面,并且错误 ID 显示给用户以寻求技术问题团队,以防用户遇到它。

这使得在 Selenium 执行期间调试测试失败有点费力。 我正在考虑使用某种机制在测试中执行的每个步骤继续轮询页面,以查找是否存在内部服务器错误的任何实例,这是当我遇到 Junit Rule 并考虑为其编写自定义注释时,一些像 -

public class SelTestCase {
    protected WebDriver driver;

    @Before
    public void startDriver() {
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("http://www.google.com/");
    }

    @After
    public void closeDriver() {
        driver.quit();
    }
}

public class GoogleSearchTest extends SelTestCase {

    @Rule
    PageChecker pageChecker = new PageChecker();

    @Test
    @CheckPage
    public void testGoogleSearch() {
        GoogleHomePage googleHomePage = PageFactory.initElements(driver,
                GoogleHomePage.class);
        googleHomePage.searchGoogle("Selenium HQ");
        assert driver.getPageSource().contains("seleniumhq") : "Selenium headquarter search failed";
    }
}

SelTestCase 类创建 WebDriver 的实例来执行测试,这里是 PageChecker 类 -

public class PageChecker extends SelTestCase {

    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.METHOD})
    public @interface CheckPage {
        // page check should take place here (Though not sure if it is right place)     
        // like if(driver.getPageSource.contains("Internal Server Error") {throw Exception ("Err")}
    }

}

这就是我遇到的问题,我该如何进行 CheckPage 注释?

【问题讨论】:

    标签: java selenium junit


    【解决方案1】:

    恕我直言,您的问题有两种解决方案。如果只有一小部分测试需要该功能,那么我不会使用规则。而是在每个测试中添加一行 errorChecker.checkPage(driver) 并在此方法中实现检查。

    如果您几乎所有的测试都需要它:

    1. 通过扩展 ExternalResource 将 SelTestCase 转换为规则。

      public class WebDriverRule extends ExternalResource {
        public WebDriver driver;
      
        @Override
        protected void before() {
          driver = new FirefoxDriver();
          driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
          driver.get("http://www.google.com/");
        }
      
        @Override
        protected void after() {
          driver.quit();
        }
      }
      
    2. 通过扩展Verifier将页面检查代码添加到规则中。

      public class PageChecker extends Verifier {
        private WebDriverRule webDriverRule;
        private enabled = true;
      
        public PageChecker(WebDriverRule webDriverRule) {
          this.webDriverRule = webDriverRule;
        }
      
        public void disable() {
          this.enabled = false;
        }
      
        @Override
        public void verify() {
          if(enabled && notValid())
            throw new AssertionError("foo");
        }
      
        private boolean notValid() {
          WebDriver driver = webDriverRule.driver;
          //do something with driver
        }
      }
      
    3. 使用org.junit.rules.RuleChain控制两条规则的执行顺序。

      public class GoogleSearchTest {
        private WebDriverRule webDriverRule = new WebDriverRule();
        private PageChecker pageChecker = new PageChecker(webDriverRule);
      
        @Rule
        public RuleChain driverAroundPageChecker
          = RuleChain.outerRule(webDriverRule).around(pageChecker);
      
        @Test
        public void testGoogleSearch() {
          GoogleHomePage googleHomePage = PageFactory.initElements(driver,
              GoogleHomePage.class);
          googleHomePage.searchGoogle("Selenium HQ");
          assert driver.getPageSource().contains("seleniumhq") : "Selenium headquarter search failed";
        }
      
        @Test
        public void testWithouPageCheck() {
          pageChecker.disable();
          //here is your real test
        }
      }
      

    【讨论】:

    • 这与我想要的很接近,但没有奏效。我已经修改了问题以包括 SelTestCase 类的实现,该类创建和销毁驱动程序实例。我注意到时间控制到达notValid 方法,驱动程序被破坏并且我得到空指针异常。虽然我假设 verify 方法将在测试方法中的每个语句之后执行。
    猜你喜欢
    • 2014-01-13
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 2016-06-06
    • 1970-01-01
    • 2020-09-07
    相关资源
    最近更新 更多