我需要使用Selenium测试AngularJS网站,我在博客中读到,由于角度指令,很难用硒测试角度网站。 虽然我尝试使用Selenium并且我成功运行了这些案例,但是它在某些时候失败并且无法定位“无法找到元素”“没有这样的元素”或者像“空指针异常”那样不稳定。 有没有什么方法我在这里缺少成功运行selenium。 我也读过ProtectorJS,但是selenium是测试运行的优先考虑。
提前致谢。
答案 0 :(得分:0)
这个问题是因为您尝试获取的这些字段尚未存在。
不幸的是,没有可能的自动修复,但你可以做的是添加一段代码,等到这个属性存在
WebDriverWait.until(findElement(By.xpath("//[@id='id']"));
其他选项是在代码中添加wait(ms)
函数并调用它。
这两个问题都是因为这个原因你需要写很多行。
答案 1 :(得分:0)
为了等待Angular处理的元素,您可以等到所有Angular请求都完成。
Selenium提供Explicit Waits
以ExpectedCondition
预期条件示例:
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。