private XPathComponentScopeLocateResult[] ResolveScopeLocateResult(ComponentScopeLocateResult result, IWebElement scopeSource, SearchOptions searchOptions) { result.CheckNotNull(nameof(result)); if (result is MissingComponentScopeLocateResult missingResult) { return(new XPathComponentScopeLocateResult[0]); } if (result is XPathComponentScopeLocateResult xPathResult) { return new[] { xPathResult } } ; if (result is SequalComponentScopeLocateResult sequalResult) { ComponentScopeLocateOptions nextScopeLocateOptions = sequalResult.ScopeLocateOptions ?? scopeLocateOptions; if (sequalResult.ScopeSource != null) { ComponentScopeLocateResult nextResult = sequalResult.Strategy.Find(sequalResult.ScopeSource, nextScopeLocateOptions, searchOptions); return(ResolveScopeLocateResult(nextResult, sequalResult.ScopeSource, searchOptions)); } else { IWebElement[] nextScopeSources = scopeSource.GetAll(sequalResult.ScopeSourceBy.With(searchOptions)).ToArray(); SearchOptions nextSearchOptions = SearchOptions.SafelyAtOnce(); var results = nextScopeSources. Select(nextScopeSource => sequalResult.Strategy.Find(nextScopeSource, nextScopeLocateOptions, nextSearchOptions)). Select(nextResult => ResolveScopeLocateResult(nextResult, nextScopeSources[0], nextSearchOptions)). Where(xPathResults => xPathResults != null). SelectMany(xPathResults => xPathResults). ToArray(); if (results.Any()) { return(results); } else if (searchOptions.IsSafely) { return(new XPathComponentScopeLocateResult[0]); } else { throw ExceptionFactory.CreateForNoSuchElement(by: sequalResult.ScopeSourceBy); } } } throw new ArgumentException($"Unsupported {nameof(ComponentScopeLocateResult)} type: {result.GetType().FullName}", nameof(result)); } }
private XPathComponentScopeLocateResult[] GetScopeLocateResults(SearchOptions searchOptions) { IWebElement scopeSource = component.ScopeSource.GetScopeElement(component); if (scopeSource == null && searchOptions.IsSafely) { return(new XPathComponentScopeLocateResult[0]); } ComponentScopeLocateResult result = strategy.Find(scopeSource, scopeLocateOptions, searchOptions); return(ResolveScopeLocateResult(result, scopeSource, searchOptions)); }
private XPathComponentScopeLocateResult[] ExecuteStrategyAndResolveResults(IComponentScopeLocateStrategy strategy, IWebElement scope, ComponentScopeLocateOptions options, SearchOptions searchOptions) { ComponentScopeLocateResult result = strategy.Find(scope, options, searchOptions); return(ResolveScopeLocateResult(result, scope, searchOptions)); }
private XPathComponentScopeLocateResult[] ResolveScopeLocateResult(ComponentScopeLocateResult result, IWebElement scopeSource, SearchOptions searchOptions) { result.CheckNotNull(nameof(result)); if (result is MissingComponentScopeLocateResult missingResult) { return(new XPathComponentScopeLocateResult[0]); } if (result is XPathComponentScopeLocateResult xPathResult) { return new[] { xPathResult } } ; if (result is SequalComponentScopeLocateResult sequalResult) { ComponentScopeLocateOptions nextScopeLocateOptions = sequalResult.ScopeLocateOptions ?? scopeLocateOptions; if (sequalResult.ScopeSources?.Count() == 1) { return(ExecuteStrategyAndResolveResults(sequalResult.Strategy, sequalResult.ScopeSources.First(), nextScopeLocateOptions, searchOptions)); } else { IEnumerable <IWebElement> nextScopeSources = sequalResult.ScopeSourceBy != null ? scopeSource.GetAll(sequalResult.ScopeSourceBy.With(searchOptions)) : sequalResult.ScopeSources; SearchOptions nextSearchOptions = SearchOptions.SafelyAtOnce(); var results = nextScopeSources. Select(nextScopeSource => ExecuteStrategyAndResolveResults(sequalResult.Strategy, nextScopeSource, nextScopeLocateOptions, nextSearchOptions)). Where(xPathResults => xPathResults != null). SelectMany(xPathResults => xPathResults). ToArray(); if (results.Any()) { return(results); } else if (searchOptions.IsSafely) { return(new XPathComponentScopeLocateResult[0]); } else { throw ExceptionFactory.CreateForNoSuchElement( new SearchFailureData { ElementName = component.ComponentFullName, By = sequalResult.ScopeSourceBy, SearchOptions = searchOptions, SearchContext = scopeSource }); } } } throw new ArgumentException($"Unsupported {nameof(ComponentScopeLocateResult)} type: {result.GetType().FullName}", nameof(result)); }
private static XPathComponentScopeFindResult[] Execute(object strategy, ISearchContext scope, ComponentScopeLocateOptions scopeLocateOptions, SearchOptions searchOptions) { ComponentScopeLocateResult result = ExecuteToGetResult(strategy, scope, scopeLocateOptions, searchOptions); return(ResolveResult(result, scope, scopeLocateOptions, searchOptions)); }
private XPathComponentScopeLocateResult[] ResolveScopeLocateResults(ComponentScopeLocateResult result, IWebElement scopeSource, SearchOptions searchOptions) { result.CheckNotNull("result"); MissingComponentScopeLocateResult missingResult = result as MissingComponentScopeLocateResult; if (missingResult != null) return null; XPathComponentScopeLocateResult xPathResult = result as XPathComponentScopeLocateResult; if (xPathResult != null) return new[] { xPathResult }; SequalComponentScopeLocateResult sequalResult = result as SequalComponentScopeLocateResult; if (sequalResult != null) { ComponentScopeLocateOptions nextScopeLocateOptions = sequalResult.ScopeLocateOptions ?? scopeLocateOptions; if (sequalResult.ScopeSource != null) { ComponentScopeLocateResult nextResult = sequalResult.Strategy.Find(sequalResult.ScopeSource, nextScopeLocateOptions, searchOptions); return ResolveScopeLocateResults(nextResult, sequalResult.ScopeSource, searchOptions); } else { IWebElement[] nextScopeSources = scopeSource.GetAll(sequalResult.ScopeSourceBy.With(searchOptions)).ToArray(); SearchOptions nextSearchOptions = SearchOptions.SafelyAndImmediately(); var results = nextScopeSources. Select(nextScopeSource => sequalResult.Strategy.Find(nextScopeSource, nextScopeLocateOptions, nextSearchOptions)). Select(nextResult => ResolveScopeLocateResults(nextResult, nextScopeSources[0], nextSearchOptions)). Where(xPathResults => xPathResults != null). SelectMany(xPathResults => xPathResults). ToArray(); if (results.Any()) return results; else if (searchOptions.IsSafely) return null; else throw ExceptionFactory.CreateForNoSuchElement(by: sequalResult.ScopeSourceBy); } } throw new ArgumentException("Unsupported ComponentScopeLocateResult type: {0}".FormatWith(result.GetType().FullName), "result"); }