我有一个自动化测试环境,由一台开发机器和两个以自动化方式运行测试的盒子组成。三台机器都运行 Windows 10。三台机器都使用相同版本的 WinAppDriver,并且三台机器都使用最新版本的 Google Chrome。这三个都在机器上登录的本地管理员帐户下运行。
我最初在 IE 中构建了所有测试,但由于浏览器不稳定,我一直试图将它们转换为 Chrome。
在这个特定的例子中,我使用 WinAppDriver 来检测浏览器何时向用户呈现下载对话框。它似乎在所有机器上的 IE 中都能正常工作。它甚至可以在开发机器上的 Chrome 中正常工作,但在测试机器上的 Chrome 中无法正常工作。
到目前为止,我一直无法弄清楚测试机器上可能有什么不同,除了 MSBuild 是由测试机器上的 TFS 和开发机器上的 Visual Studio 启动的这一事实。
如您所见,除了测试机器上的完全失败之外,唯一的其他区别似乎在于对初始浏览器挂钩的响应。工作的不返回 sessionId,而失败的则返回。对我来说,这表明产品版本存在差异,但我验证了 WinAppDriver 的两个版本是相同的。
我已经尝试了多个版本的 XPath 查找,以防万一这是问题,但它们都在开发机器上工作,而没有一个在测试机器上工作。
有谁知道为什么我的测试框无法在 Chrome 中专门执行此查找?
编辑:请求了代码,屏幕截图有点多余,但在这里。
this.BaseBrowser.NavigateToUrl(new System.Uri(string.Format("{0}&Export=Excel", MainDocument.PageUrl)));
var wait = new OpenQA.Selenium.Support.UI.WebDriverWait(BaseBrowser.Window, new TimeSpan(0, 0, 0, 0, 5000)); // wait for 5 seconds
IWebElement export_cancel =
(Settings.TestBrowser == Brow.IE) ? wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementExists(By.XPath("//ToolBar/Button[@Name=\"Cancel\"]"))) :
(Settings.TestBrowser == Brow.Chrome) ? wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementExists(By.XPath("//Pane/Pane/Pane/Group/Button[@Name=\"Close\"]"))) :
null; // exception thrown on this if statement if browser is Chrome;
Mouse.Click(export_cancel);
以及异常的文本,也显示在屏幕截图中:
WebDriverException -> 使用给定的搜索参数无法在页面上找到元素。StackTrace:在 OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse) 在 OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary'2 参数) 在 OpenQA.Selenium.Remote.RemoteWebDriver.FindElement(String mechanism, String值)在 OpenQA.Selenium.Remote.RemoteWebDriver.FindElementByXPath(String xpath) 在 OpenQA.Selenium.By.<>c__DisplayClass19_0.b__0(ISearchContext context) 在 OpenQA.Selenium.By.FindElement(ISearchContext context) 在 OpenQA.Selenium.Remote .RemoteWebDriver.FindElement(By by) 在 SeleniumExtras.WaitHelpers.ExpectedConditions.<>c__DisplayClass6_0.b__0(IWebDriver driver) 在 OpenQA.Selenium.Support.UI.DefaultWait'1。
编辑 2:将 WinAppDriver 挂接到浏览器进程中的 BaseBrowser.Window 方法摘录:
System.Diagnostics.Process[] localByName = System.Diagnostics.Process.GetProcessesByName(this.BaseProcessName);
foreach (System.Diagnostics.Process item in localByName)
{
if (item.MainWindowTitle == string.Format(BaseProcessTitleFormat, this.Title))
{
DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
desiredCapabilities.SetCapability("appTopLevelWindow", item.MainWindowHandle.ToString("x"));
RemoteWebDriver session = new RemoteWebDriver(new Uri(windowsAppDriverUrl), desiredCapabilities, new TimeSpan(0, 1, 30));
_Window = session;
break;
}
}
return _Window;