Selenium在AngularJS站点中搜索元素时显示Null指针异常

时间:2017-01-11 12:06:15

标签: javascript angularjs selenium protractor

我需要使用Selenium测试AngularJS网站,我在博客中读到,由于角度指令,很难用硒测试角度网站。 虽然我尝试使用Selenium并且我成功运行了这些案例,但是它在某些时候失败并且无法定位“无法找到元素”“没有这样的元素”或者像“空指针异常”那样不稳定。 有没有什么方法我在这里缺少成功运行selenium。 我也读过ProtectorJS,但是selenium是测试运行的优先考虑。

提前致谢。

3 个答案:

答案 0 :(得分:0)

这个问题是因为您尝试获取的这些字段尚未存在。

不幸的是,没有可能的自动修复,但你可以做的是添加一段代码,等到这个属性存在

WebDriverWait.until(findElement(By.xpath("//[@id='id']"));

其他选项是在代码中添加wait(ms)函数并调用它。

这两个问题都是因为这个原因你需要写很多行。

答案 1 :(得分:0)

为了等待Angular处理的元素,您可以等到所有Angular请求都完成。

Selenium提供Explicit WaitsExpectedCondition

执行此类任务

预期条件示例:

 public static ExpectedCondition<Boolean> angularHasFinishedProcessing() {
return new ExpectedCondition<Boolean>() {
    @Override
    public Boolean apply(WebDriver driver) {
        return Boolean.valueOf(((JavascriptExecutor) driver).executeScript("return (window.angular !== undefined) && (angular.element(document).injector() !== undefined) && (angular.element(document).injector().get('$http').pendingRequests.length === 0)").toString());
    }
};

}

之后,我们可以使用我们的代码等待所有AJAX请求完成 我们在ExpectedCondition中提供了使用Explicit Waits

实施的WebDriverWait
WebDriverWait wait = new WebDriverWait(driver, 15, 100);
wait.until(AdditionalConditions. angularHasFinishedProcessing()));

我们在这里做的是,我们使用JavascriptExecutor并执行javascript来获取待处理的请求。如果没有待处理请求,我们可以使用此元素。

答案 2 :(得分:0)

我遇到了同样的问题。隐含的硒等待不适用于角度,我不想让我的测试变得混乱,显着的等待会大大增加测试持续时间。

我发现了这个:https://github.com/paul-hammant/ngWebDriver

这是一个源自Protractor的webDriver,可以在Selenium中使用。

我写了一个动作类,在执行动作(点击,填充,检查等)之前,我等待Angular。有关代码段,请参阅my answer to this question