在调用 FindElement 之前确定 Angular 是否存在



我有这些浏览器驱动程序:

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(分开检测似乎是不可能的。

当 Angular 加载时,它会添加自己的类,例如 ng-untouched ng-pristine ng-valid元素。

如果在 XPath 中直接匹配类值,这可能是在加载角度时无法找到元素的原因。

至于网络驱动程序,

您可以使用此网络驱动程序,该驱动程序具有内置方法来等待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以查看您的应用程序中是否加载了角度。

你可以像这样使用它:

WebDriverWait wait = new WebDriverWait(getDriver(), 15, 100);
wait.until(AdditionalConditions.angularHasFinishedProcessing()));

相关内容

  • 没有找到相关文章

最新更新