Selenium webdriver 选择新的 window c#
Selenium webdriver selecting new window c#
尝试在 C# 中使用 selenium webdriver 编写一些测试用例,但遇到一个我不确定如何解决的场景
用户场景正在搜索 table 患者,select 患者然后打开新的 window,然后断言 window[=11 上的各种项目=]
我的问题是我无法 select 新的 window 断言任何东西,它不是弹出窗口 window,它是一个全新的浏览器 window 但它没有 window title/name 来识别它,我怎样才能将驱动程序焦点切换到这个 window?
提前致谢
如果我收集正确,您的应用程序将自行生成 window,无需用户进一步干预。您应该能够等待页面加载,然后您可以像往常一样调用您的断言。
Selenium 已经有了您的浏览器会话,因此新的 window 对 selenium 来说不是问题,它只是新内容。
在 Selenium WebDriver 中真的很容易。通过使用 SwitchTo 方法
driver.SwitchTo().Window(driver.WindowHandles.Last());
也请参阅此博客 post
http://binaryclips.com/2015/03/13/selenium-webdriver-in-c-switch-to-new-window/
foreach (string defwindow in driver.WindowHandles)
{
driver.SwitchTo().Window(defwindow);
if(driver.Title == "")
{
selenium.WindowFocus();
selenium.SelectWindow("");
}
}
"" - 表示您的 window 头衔
我有一些您可能会喜欢的代码。最快的解决方案是使用 Popup Finder,但我也有自己的方法。我永远不会依赖 Window 句柄到 select 适当 window 的顺序。
弹出 Window 查找器:
PopupWindowFinder finder = new PopupWindowFinder(driver);
driver.SwitchTo().Window(newWin);
我的自定义方法。基本上,您将要单击的元素、您的网络驱动程序以及单击该元素后搜索之前等待的时间(可选)传递给它。
它会获取您当前所有的句柄并制作一个列表。它使用该列表来消除先前存在的 windows 以防止意外切换到。然后它单击启动新 window 的元素。点击后应该总是有某种延迟,因为没有立即发生。然后它创建一个新列表并将其与旧列表进行比较,直到找到新的 window 或循环到期。如果它找不到新的 window 它 returns null,所以如果你有一个不总是有效的不稳定的网络元素,你可以进行 null 检查以查看开关是否有效。
public static string ClickAndSwitchWindow(IWebElement elementToBeClicked,
IWebDriver driver, int timer = 2000)
{
System.Collections.Generic.List<string> previousHandles = new
System.Collections.Generic.List<string>();
System.Collections.Generic.List<string> currentHandles = new
System.Collections.Generic.List<string>();
previousHandles.AddRange(driver.WindowHandles);
elementToBeClicked.Click();
Thread.Sleep(timer);
for (int i = 0; i < 20; i++)
{
currentHandles.Clear();
currentHandles.AddRange(driver.WindowHandles);
foreach (string s in previousHandles)
{
currentHandles.RemoveAll(p => p == s);
}
if (currentHandles.Count == 1)
{
driver.SwitchTo().Window(currentHandles[0]);
Thread.Sleep(100);
return currentHandles[0];
}
else
{
Thread.Sleep(500);
}
}
return null;
}
这段代码对我有用。在我的例子中,新的 window/tab 是一个有一定重量的 PDF,所以我在加载时进行了一些自定义等待。
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
int previousWinCount = driver.WindowHandles.Count;
// Perform the action to open a new Window
wait.Until(driver => driver.WindowHandles.Count == (previousWinCount + 1));
driver.SwitchTo().Window(driver.WindowHandles.Last());
wait.Until(driver => driver.Url.Contains("desired_url_or_a_substring_of_it"));
注意PDF加载时的driver.Url是"about:blank".
IWebDriver _driver = new FirefoxDriver();
_driver.Navigate().GoToUrl("https://www.google.com");
ReadOnlyCollection<string> WindowHandles = _driver.WindowHandles;
foreach (string item in WindowHandles)
{
_driver.SwitchTo().Window(item);
string browserTitle = _driver.Title;
string browserPageSource = _driver.PageSource;
string browserURL = _driver.Url;
}
使用 ReadOnlyCollection 并处理浏览器,获取您的 window 的标题并比较并关注您想要的浏览器 window。
尝试在 C# 中使用 selenium webdriver 编写一些测试用例,但遇到一个我不确定如何解决的场景
用户场景正在搜索 table 患者,select 患者然后打开新的 window,然后断言 window[=11 上的各种项目=]
我的问题是我无法 select 新的 window 断言任何东西,它不是弹出窗口 window,它是一个全新的浏览器 window 但它没有 window title/name 来识别它,我怎样才能将驱动程序焦点切换到这个 window?
提前致谢
如果我收集正确,您的应用程序将自行生成 window,无需用户进一步干预。您应该能够等待页面加载,然后您可以像往常一样调用您的断言。
Selenium 已经有了您的浏览器会话,因此新的 window 对 selenium 来说不是问题,它只是新内容。
在 Selenium WebDriver 中真的很容易。通过使用 SwitchTo 方法
driver.SwitchTo().Window(driver.WindowHandles.Last());
也请参阅此博客 post
http://binaryclips.com/2015/03/13/selenium-webdriver-in-c-switch-to-new-window/
foreach (string defwindow in driver.WindowHandles)
{
driver.SwitchTo().Window(defwindow);
if(driver.Title == "")
{
selenium.WindowFocus();
selenium.SelectWindow("");
}
}
"" - 表示您的 window 头衔
我有一些您可能会喜欢的代码。最快的解决方案是使用 Popup Finder,但我也有自己的方法。我永远不会依赖 Window 句柄到 select 适当 window 的顺序。 弹出 Window 查找器:
PopupWindowFinder finder = new PopupWindowFinder(driver);
driver.SwitchTo().Window(newWin);
我的自定义方法。基本上,您将要单击的元素、您的网络驱动程序以及单击该元素后搜索之前等待的时间(可选)传递给它。
它会获取您当前所有的句柄并制作一个列表。它使用该列表来消除先前存在的 windows 以防止意外切换到。然后它单击启动新 window 的元素。点击后应该总是有某种延迟,因为没有立即发生。然后它创建一个新列表并将其与旧列表进行比较,直到找到新的 window 或循环到期。如果它找不到新的 window 它 returns null,所以如果你有一个不总是有效的不稳定的网络元素,你可以进行 null 检查以查看开关是否有效。
public static string ClickAndSwitchWindow(IWebElement elementToBeClicked,
IWebDriver driver, int timer = 2000)
{
System.Collections.Generic.List<string> previousHandles = new
System.Collections.Generic.List<string>();
System.Collections.Generic.List<string> currentHandles = new
System.Collections.Generic.List<string>();
previousHandles.AddRange(driver.WindowHandles);
elementToBeClicked.Click();
Thread.Sleep(timer);
for (int i = 0; i < 20; i++)
{
currentHandles.Clear();
currentHandles.AddRange(driver.WindowHandles);
foreach (string s in previousHandles)
{
currentHandles.RemoveAll(p => p == s);
}
if (currentHandles.Count == 1)
{
driver.SwitchTo().Window(currentHandles[0]);
Thread.Sleep(100);
return currentHandles[0];
}
else
{
Thread.Sleep(500);
}
}
return null;
}
这段代码对我有用。在我的例子中,新的 window/tab 是一个有一定重量的 PDF,所以我在加载时进行了一些自定义等待。
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
int previousWinCount = driver.WindowHandles.Count;
// Perform the action to open a new Window
wait.Until(driver => driver.WindowHandles.Count == (previousWinCount + 1));
driver.SwitchTo().Window(driver.WindowHandles.Last());
wait.Until(driver => driver.Url.Contains("desired_url_or_a_substring_of_it"));
注意PDF加载时的driver.Url是"about:blank".
IWebDriver _driver = new FirefoxDriver();
_driver.Navigate().GoToUrl("https://www.google.com");
ReadOnlyCollection<string> WindowHandles = _driver.WindowHandles;
foreach (string item in WindowHandles)
{
_driver.SwitchTo().Window(item);
string browserTitle = _driver.Title;
string browserPageSource = _driver.PageSource;
string browserURL = _driver.Url;
}
使用 ReadOnlyCollection 并处理浏览器,获取您的 window 的标题并比较并关注您想要的浏览器 window。