我有以下浏览器驱动程序:
public IWebDriver Browser { get; }
public NgWebDriver NgBrowser { get; }
当我尝试使用XPath选择器查找元素时,如果不存在Angular,则如果我使用NgBrowser
,它将失败:
var byXpath = By.XPath(exp);
var link = NgBrowser.FindElement(byXpath);
但是,如果我尝试使用Browser
找到它,并且存在Angular,它将找不到它:
var byXpath = By.XPath(exp);
var link = Browser.FindElement(byXpath);
我是否应该将NgBrowser
调用包装在try...catch
中,并在抛出后使用Browser
重试?还是有一个更简单,更直接的方法?也许具有内置故障转移功能?
.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.1.0" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
<PackageReference Include="Protractor" Version="0.12.0" />
<PackageReference Include="Selenium.Support" Version="3.141.0" />
<PackageReference Include="Selenium.WebDriver" Version="3.141.0" />
<PackageReference Include="Selenium.WebDriver.ChromeDriver" Version="2.46.0" />
<PackageReference Include="specflow" Version="3.0.199" />
<PackageReference Include="SpecFlow.Tools.MsBuild.Generation" Version="3.0.199" />
<PackageReference Include="SpecFlow.MsTest" Version="3.0.199" />
<PackageReference Include="MSTest.TestFramework" Version="2.0.0-build-20190430-01" />
<PackageReference Include="MSTest.TestAdapter" Version="2.0.0-build-20190430-01" />
</ItemGroup>
</Project>
我目前拥有的最好的是:
[Given(@"I go to url (.*)")]
public void GoToUrl(string url)
{
NgBrowser
.Navigate()
.GoToUrl(url, false);
}
虽然这解决了在页面导航过程中检测Angular的问题,但没有回答本文的问题;也就是说,简单地将Angular与执行操作分开(特别是FindElement)似乎是不可能的。
答案 0 :(得分:2)
当Angular加载时,它会添加自己的类,例如ng-untouched ng-pristine ng-valid
到元素。
如果您直接在XPath中匹配您的类值,这可能就是为什么在加载angular时找不到元素的原因。
对于网络驱动程序,您可以使用此web driver,它具有一个内置方法来等待Angular加载。
如果您想自己处理,可以编写这样的类:
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
public class AdditionalConditions {
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());
}
};
}
}
它将检查window
对象中是否存在angular,以查看是否在应用程序中加载了angular。
您可以像这样使用它:
WebDriverWait wait = new WebDriverWait(getDriver(), 15, 100);
wait.until(AdditionalConditions.angularHasFinishedProcessing()));
希望有帮助。