Selenium webdriver OpenQA.Selenium.WebDriverException:[windowHandle]不是顶级窗口句柄解决方案

Selenium webdriver OpenQA.Selenium.WebDriverException:[windowHandle]不是顶级窗口句柄解决方案,selenium-webdriver,winappdriver,Selenium Webdriver,Winappdriver,包括我在内的一些人都受到了名为“OpenQA.Selenium.WebDriverException:[windowHandle]不是顶级窗口句柄”的问题的困扰。关于“如何连接到顶级窗口”,有很多问题被询问和回答,但实际上没有人在谈论“如何连接到非oplevelWindow”。我搜索了很多解决方案,但没有找到任何解决方案。但在GitHub上阅读了共享的代码后,我意识到解决方案是什么。 由于解决方案的简单性,我对它非常反感!然后我想与大家分享它。 解决方案非常简单。由于新窗口是子节点(即位于主应用

包括我在内的一些人都受到了名为“OpenQA.Selenium.WebDriverException:[windowHandle]不是顶级窗口句柄”的问题的困扰。

关于“如何连接到顶级窗口”,有很多问题被询问和回答,但实际上没有人在谈论“如何连接到非oplevelWindow”。我搜索了很多解决方案,但没有找到任何解决方案。但在GitHub上阅读了共享的代码后,我意识到解决方案是什么。
由于解决方案的简单性,我对它非常反感!然后我想与大家分享它。

解决方案非常简单。由于新窗口是子节点(即位于主应用程序树下),我们无法通过创建新会话附加到它。原因是,它不是顶级窗口,我们只能附加到GitHub上解释的顶级窗口。
我们需要做的只是按窗口名搜索窗口,您将可以访问该窗口(与查找UI元素相同)

例如-此代码适用于这样一个窗口,它是一个TopLevelWindow

# create a desktop session to find the new window
desired_caps = {}
desired_caps["app"] = "Root"
newDriver = webdriver.Remote(WindowsApplicationDriverUrl, desired_caps)

# Find the NativeWIndowHandle of the new window
newWindow = newDriver.find_element_by_name("SmarTTY - New SSH Connection")
newWindowHandle = newWindow.get_attribute("NativeWindowHandle")

# create a new session to attach the new window with its NativeWindowHandle
desired_caps = {}
desired_caps["appTopLevelWindow"] = newWindowHandle
connWinDriver = webdriver.Remote(WindowsApplicationDriverUrl, desired_caps)
# Find the new window
newPopUpWindow = driverMain.find_element_by_name("SmarTTY - New SSH Connection")
此代码适用于这样一个窗口,它是一个非同级窗口

# create a desktop session to find the new window
desired_caps = {}
desired_caps["app"] = "Root"
newDriver = webdriver.Remote(WindowsApplicationDriverUrl, desired_caps)

# Find the NativeWIndowHandle of the new window
newWindow = newDriver.find_element_by_name("SmarTTY - New SSH Connection")
newWindowHandle = newWindow.get_attribute("NativeWindowHandle")

# create a new session to attach the new window with its NativeWindowHandle
desired_caps = {}
desired_caps["appTopLevelWindow"] = newWindowHandle
connWinDriver = webdriver.Remote(WindowsApplicationDriverUrl, desired_caps)
# Find the new window
newPopUpWindow = driverMain.find_element_by_name("SmarTTY - New SSH Connection")
在这种情况下,由于窗口不是顶级窗口,第一个代码将不起作用。但第二个代码将起作用。
此窗口(窗口名称为SmarTTY-New SSH Connection
)单击上一个窗口上的按钮后弹出窗口。此示例所基于的应用程序名称是SmarTTY。上面的代码是WinAppDriver

的Python代码。这是我的C代码,我正在添加它,因为所需的功能已被删除,应该使用选项:

>
    AppiumOptions rootSessionOptions = new AppiumOptions();
    rootSessionOptions.AddAdditionalCapability("app", "Root");
    rootSessionOptions.AddAdditionalCapability("deviceName", "WindowsPC");
    _driver = new WindowsDriver<WindowsElement>(new Uri("http://127.0.0.1:4723"), rootSessionOptions);
    _driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5);

    var VSWindow = _driver.FindElementByName("Your project name without .csproj - Microsoft Visual Studio");
    var VSTopLevelWindowHandle = VSWindow.GetAttribute("NativeWindowHandle");
    VSTopLevelWindowHandle = (int.Parse(VSTopLevelWindowHandle)).ToString("x");

    AppiumOptions VisualStudioSessionOptions = new AppiumOptions();
    VisualStudioSessionOptions.AddAdditionalCapability("appTopLevelWindow", VSTopLevelWindowHandle);
    _driver = new WindowsDriver<WindowsElement>(new Uri("http://127.0.0.1:4723"), VisualStudioSessionOptions);

    _driver.SwitchTo().Window(_driver.WindowHandles[0]);
AppiumOptions-rootSessionOptions=new-AppiumOptions();
rootSessionOptions.AddAdditionalCapability(“app”、“Root”);
rootSessionOptions.AddAdditionalCapability(“deviceName”、“WindowsPC”);
_驱动程序=新的Windows驱动程序(新Uri(“http://127.0.0.1:4723),rootSessionOptions);
_driver.Manage().Timeouts().ImplicitWait=TimeSpan.FromSeconds(5);
var VSWindow=_driver.FindElementByName(“没有.csproj的项目名称-Microsoft Visual Studio”);
var VSTopLevelWindowHandle=VSWindow.GetAttribute(“NativeWindowHandle”);
VSTopLevelWindowHandle=(int.Parse(VSTopLevelWindowHandle)).ToString(“x”);
AppiumOptions VisualStudioSessionOptions=新的AppiumOptions();
VisualStudioSessionOptions.AddAddAdditionalCapability(“appTopLevelWindow”,VSTopLevelWindowHandle);
_驱动程序=新的Windows驱动程序(新Uri(“http://127.0.0.1:4723)、VisualStudioSessionOptions);
_driver.SwitchTo().Window(_driver.WindowHandles[0]);

这是topLevelwindow或“nonTopLevelWindow”的代码?这是topLevelwindow的代码。可以找到类似于VSWindow的nonTopLevelWindow-在您连接到topLevelwindow之后,类似于Shabbir的第二个代码段:var nonTopLevelWindow=\u driver.FindElementByName(“您的窗口名”);topLevelWindow机制为我们提供了一些其他优势,比如用它创建一个会话,一旦创建了一个会话,就可以很容易地进行诸如“newSessionByName.close()之类的操作“将关闭顶层窗口。我觉得当这不是一个顶级窗口时,我们会错过这些优势。我正在单击取消、确定等以关闭弹出窗口。