1. selenium能实现窗口切换的原理
有些网页应用可能有很多的frame或者windows。那么selenium是如何区别不同的windows的呢? 它是这样做的, 一旦实例化webdriver对象,selenium的webdriver就会给每个窗口分配一个string字符串id,这个id叫做这个该窗口的句柄,每个窗口都有唯一的id,所以selenium就可以在不同的窗口间实现切换。
ps: 刷新整个页面以后,id会变化。
2. 常见命令
2.1 WindowHandle
目的: 获取当前句柄
string handble = driver.WindowHandle
2.2 WindowHandles
目的: 获取当前打开的所有句柄
ReadOnlyCollection<string> allHandles = driver.WindowHandles;
2.3 SwtichTo
根据string切换到另外一个句柄
public void SwitchWindowsHandle(IWebDriver driver, string currentHandles)
{
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
ReadOnlyCollection<string> allHandles = driver.WindowHandles;
wait.Until((_driver) => { return _driver.WindowHandles.Count != 1; });
foreach (string handle in allHandles)
{
if (handle != currentHandles)
{
driver.SwitchTo().Window(handle);
}
}
}
3. 使用JavaScript切换窗口
selenium只能得到窗口,切换窗口,但是要是我们想要新建一个窗口,并且输入一个已知的url,该如何显示? 这个时候就要用到JavaScript来进行补充。
IJavaScriptExecutor jscript = driver as IJavaScriptExecutor;
jscript.ExecuteScript("window.open()");
List<string> handles = driver.WindowHandles.ToList<string>();
driver.SwitchTo().Window(handles.Last());
driver.Navigate().GoToUrl(url);
4. 还能SwitchTo什么
我在用SwitchTo().Windows()
时候发现, SwitchTo返回的是一个ITargetLocator类型的对象。就研究了一下ITarget是什么。
根据Selenium官网的介绍,一共可以返回八种类型的东西。
1.ActiveElement:
返回当前聚焦的元素,这个可以通过tab键来看,focus的元素通常都会被文本框圈出来。
2.Alert
返回当前active的Alert
3.DefaultContent()
返回页面中的第一个frame 或者 让页面有iframe的时候返回主页面。
driver.switchTo.frame("Frame_ID"); //从主页面切换到frame
driver.switchTo().defaultContent(); //从frame切到回到主页面
4.Frame(Int32)
根据index切换frame
driver.SwitchTo().Frame(0);
5.Frame(String)
根据frame的name或者id定位
6.Frame(IWebElement)
通过已经找到的IWebElment元素切换
IWebElement iframePart = driver.FindElement(By.ClassName(iframeClassName));
driver.SwitchTo().Frame(iframePart);
7.ParentFrame
选择当前选择的frame的parent, 要注意和SwitchTo()DefaultContent()的区别,一个是parent,一个是最顶级的。
8.Window
切换window
参考资料:
- Selenium WebDriver Switch Window Commands
- OpenQA_Selenium_ITargetLocator
- how-to-switch-between-frames-in-selenium-webdriver-using-java
- what-is-the-difference-between-driver-switchto-parentframe-and-driver-switch/51105138#51105138
本文希望对您有所帮助,如何问题可联系我的个人微信