有没有办法关闭 WebDriver 或 Protractor 中的选项卡?
Is there a way to close a tab in WebDriver or Protractor?
有没有办法通过 Protractor 或 WebDriver 物理关闭选项卡?
我问是因为虽然我知道如何以编程方式 switch tabs,但它不会将活动选项卡带到前台。在 SauceLabs 上 运行 我的 E2E 测试中,我不能总是说出发生了什么,因为当我查看屏幕截图时,它显示的是我导航离开的选项卡,而不是活动选项卡。
我是不是做错了?
it('should do something in the previous tab', function(done) {
browser.getAllWindowHandles().then(function (handles) {
browser.switchTo().window(handles[0]);
// do something
expect(something).toEqual(thisThing);
done();
});
});
首先,selenium 不提供可靠的跨浏览器API 来处理浏览器选项卡。打开或关闭选项卡的常用方法(虽然不太可靠)是为 Chrome:
调用浏览器快捷方式
- 打开选项卡:
CTRL
/COMMAND
+ T
- 关闭标签:
CTRL
/COMMAND
+ W
在量角器中,找到 body
元素和 "send keys" 到它:
var body = element(by.tagName("body"));
body.sendKeys(protractor.Key.chord(protractor.Key.CONTROL, "t"))
body.sendKeys(protractor.Key.chord(protractor.Key.CONTROL, "w"))
或者,使用 browser.actions()
:
browser.actions().keyDown(protractor.Key.CONTROL).sendKeys('t').perform();
browser.actions().keyDown(protractor.Key.CONTROL).sendKeys('w').perform();
此外,要打开一个新选项卡,有一个有趣的 hack(介绍 here),它基本上是在页面中注入一个新的 a
元素并调用 click
鼠标事件:
function openNewTab (url) {
return browser.driver.executeScript(function(url) {(
function(a, url){
document.body.appendChild(a);
a.setAttribute('href', url);
a.dispatchEvent((function(e){
e.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, true, false, false, false, 0, null);
return e;
}(document.createEvent('MouseEvents'))))
}(document.createElement('a'), url)
);
}, url)
};
还有window.close()
function, but it would not close the tab if it was not opened via window.open()
(reference)。换句话说,如果这是您手动打开的选项卡,那么您可以在 browser.executeScript()
.
的帮助下使用 window.open() -> window.close()
方法
您可以尝试以下方法:
- 切换到新打开的标签页。
- 关闭当前 windows(在本例中为新选项卡)。
切换回第一个window。
browser.getAllWindowHandles().then(function (handles) {
browser.driver.switchTo().window(handles[1]);
browser.driver.close();
browser.driver.switchTo().window(handles[0]);
});
我在新标签页中打开 link 后使用下面的命令关闭当前标签页
Instance.Driver2.SwitchTo().Window(Instance.Driver2.WindowHandles[1]).Close();
然后,您可以通过发出命令切换到最后一个选项卡:
Instance.Driver2.SwitchTo().Window(Instance.Driver2.WindowHandles[0]);
Sakshi 答案的 C# 版本:
var tabs = driver.WindowHandles;
if (tabs.Count > 1)
{
driver.SwitchTo().Window(tabs[1]);
driver.Close();
driver.SwitchTo().Window(tabs[0]);
}
你可以使用
driver.close
然后切换到活动标签 driver.SwitchTo().Window(m_driver.WindowHandles.First());
或任何其他可用标签
关闭第一个选项卡以外的所有选项卡并切换到第一个选项卡:
var tabs = driver.WindowHandles; //
foreach (var tab in tabs)
{
// "tab" is a string like "CDwindow-6E793DA3E15E2AB5D6AE36A05344C68"
if (tabs[0] != tab)
{
driver.SwitchTo().Window(tab);
driver.Close();
}
}
driver.SwitchTab(tabs[0]); // Switch to first tab
driver.SwitchTo().DefaultContent(); // Switch to default frame
注意最后两行,它们需要避免像OpenQA.Selenium.NoSuchWindowException: no such window: target window already closed
from unknown error: web view not found
这样的错误
正如 Sakshi Singla 回答的那样,browser.driver.close()
对我有用,请查看 Protractor Jasmine 的示例 spec.js
。
describe('Window handle', function() {
//Each single it function is a test script
it('Navigae to the site', function() {
browser.driver.ignoreSynchronization = true;
browser.waitForAngularEnabled(false);
browser.driver.get('http://demo.automationtesting.in/Windows.html');
});
it('handle the new window', function() {
//This will open a new popup
element(by.buttonText('click')).click();
var winHandles=browser.getAllWindowHandles();
winHandles.then(function(handles)
{
var parentWindow=handles[0];
var popUpWindow=handles[1];
browser.switchTo().window(popUpWindow);
//verify title in the new window
expect(browser.getTitle()).toEqual('Sakinalium | Home');
element(by.linkText('Contact')).click();
//To close the popup
browser.driver.close();
//verify title in the parent window
browser.switchTo().window(parentWindow);
expect(browser.getTitle()).toEqual('Frames & windows');
element(by.linkText('Open Seperate Multiple Windows')).click();
browser.sleep(7500);
})
});
})
如果将键盘库与 selenium 一起使用,则打开选项卡和关闭等操作非常简单:
首先安装键盘库:
pip install keyboard
第二次使用键盘关闭代码中的选项卡,例如:
def change_tab_my_func(self, number):
driver.switch_to.window(driver.window_handles[number])
change_tab_my_func(0) #your tab index
keyboard.send('ctrl+w')
你可以做到
await browser.executeScript('window.close()');
别忘了切换到工作标签
let tabs = await browser.getAllWindowHandles();
await browser.switchTo().window(tabs[0]);
由于我们不确定,新打开的标签页是哪个;如果您知道所需选项卡的 URL 包含一些独特的部分,您可以在 C# 中执行类似的操作:
string uniqueURL = "your unique text in URL of the tab you want to keep";
var windowHandles = driver.WindowHandles;
if(windowHandles.Count > 1)
{
foreach(var tab in windowHandles)
{
driver.SwitchTo().Window(tab);
if(!driver.Url.Contains(uniqueURL))
{
driver.Close();
}
}
driver.SwitchTo().Window(driver.WindowHandles.First());
}
此代码适用于 Java
的 selenium
ArrayList<String> switchTabs= new ArrayList<String> (driver.getWindowHandles());
driver.switchTo().window(switchTabs.get(1));
driver.close();
driver.switchTo().window(switchTabs.get(0));
注意:根据您的要求关闭选项卡
有没有办法通过 Protractor 或 WebDriver 物理关闭选项卡?
我问是因为虽然我知道如何以编程方式 switch tabs,但它不会将活动选项卡带到前台。在 SauceLabs 上 运行 我的 E2E 测试中,我不能总是说出发生了什么,因为当我查看屏幕截图时,它显示的是我导航离开的选项卡,而不是活动选项卡。
我是不是做错了?
it('should do something in the previous tab', function(done) {
browser.getAllWindowHandles().then(function (handles) {
browser.switchTo().window(handles[0]);
// do something
expect(something).toEqual(thisThing);
done();
});
});
首先,selenium 不提供可靠的跨浏览器API 来处理浏览器选项卡。打开或关闭选项卡的常用方法(虽然不太可靠)是为 Chrome:
调用浏览器快捷方式- 打开选项卡:
CTRL
/COMMAND
+T
- 关闭标签:
CTRL
/COMMAND
+W
在量角器中,找到 body
元素和 "send keys" 到它:
var body = element(by.tagName("body"));
body.sendKeys(protractor.Key.chord(protractor.Key.CONTROL, "t"))
body.sendKeys(protractor.Key.chord(protractor.Key.CONTROL, "w"))
或者,使用 browser.actions()
:
browser.actions().keyDown(protractor.Key.CONTROL).sendKeys('t').perform();
browser.actions().keyDown(protractor.Key.CONTROL).sendKeys('w').perform();
此外,要打开一个新选项卡,有一个有趣的 hack(介绍 here),它基本上是在页面中注入一个新的 a
元素并调用 click
鼠标事件:
function openNewTab (url) {
return browser.driver.executeScript(function(url) {(
function(a, url){
document.body.appendChild(a);
a.setAttribute('href', url);
a.dispatchEvent((function(e){
e.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, true, false, false, false, 0, null);
return e;
}(document.createEvent('MouseEvents'))))
}(document.createElement('a'), url)
);
}, url)
};
还有window.close()
function, but it would not close the tab if it was not opened via window.open()
(reference)。换句话说,如果这是您手动打开的选项卡,那么您可以在 browser.executeScript()
.
window.open() -> window.close()
方法
您可以尝试以下方法:
- 切换到新打开的标签页。
- 关闭当前 windows(在本例中为新选项卡)。
切换回第一个window。
browser.getAllWindowHandles().then(function (handles) { browser.driver.switchTo().window(handles[1]); browser.driver.close(); browser.driver.switchTo().window(handles[0]); });
我在新标签页中打开 link 后使用下面的命令关闭当前标签页
Instance.Driver2.SwitchTo().Window(Instance.Driver2.WindowHandles[1]).Close();
然后,您可以通过发出命令切换到最后一个选项卡:
Instance.Driver2.SwitchTo().Window(Instance.Driver2.WindowHandles[0]);
Sakshi 答案的 C# 版本:
var tabs = driver.WindowHandles;
if (tabs.Count > 1)
{
driver.SwitchTo().Window(tabs[1]);
driver.Close();
driver.SwitchTo().Window(tabs[0]);
}
你可以使用
driver.close
然后切换到活动标签 driver.SwitchTo().Window(m_driver.WindowHandles.First());
或任何其他可用标签
关闭第一个选项卡以外的所有选项卡并切换到第一个选项卡:
var tabs = driver.WindowHandles; //
foreach (var tab in tabs)
{
// "tab" is a string like "CDwindow-6E793DA3E15E2AB5D6AE36A05344C68"
if (tabs[0] != tab)
{
driver.SwitchTo().Window(tab);
driver.Close();
}
}
driver.SwitchTab(tabs[0]); // Switch to first tab
driver.SwitchTo().DefaultContent(); // Switch to default frame
注意最后两行,它们需要避免像OpenQA.Selenium.NoSuchWindowException: no such window: target window already closed
from unknown error: web view not found
正如 Sakshi Singla 回答的那样,browser.driver.close()
对我有用,请查看 Protractor Jasmine 的示例 spec.js
。
describe('Window handle', function() {
//Each single it function is a test script
it('Navigae to the site', function() {
browser.driver.ignoreSynchronization = true;
browser.waitForAngularEnabled(false);
browser.driver.get('http://demo.automationtesting.in/Windows.html');
});
it('handle the new window', function() {
//This will open a new popup
element(by.buttonText('click')).click();
var winHandles=browser.getAllWindowHandles();
winHandles.then(function(handles)
{
var parentWindow=handles[0];
var popUpWindow=handles[1];
browser.switchTo().window(popUpWindow);
//verify title in the new window
expect(browser.getTitle()).toEqual('Sakinalium | Home');
element(by.linkText('Contact')).click();
//To close the popup
browser.driver.close();
//verify title in the parent window
browser.switchTo().window(parentWindow);
expect(browser.getTitle()).toEqual('Frames & windows');
element(by.linkText('Open Seperate Multiple Windows')).click();
browser.sleep(7500);
})
});
})
如果将键盘库与 selenium 一起使用,则打开选项卡和关闭等操作非常简单:
首先安装键盘库:
pip install keyboard
第二次使用键盘关闭代码中的选项卡,例如:
def change_tab_my_func(self, number):
driver.switch_to.window(driver.window_handles[number])
change_tab_my_func(0) #your tab index
keyboard.send('ctrl+w')
你可以做到
await browser.executeScript('window.close()');
别忘了切换到工作标签
let tabs = await browser.getAllWindowHandles();
await browser.switchTo().window(tabs[0]);
由于我们不确定,新打开的标签页是哪个;如果您知道所需选项卡的 URL 包含一些独特的部分,您可以在 C# 中执行类似的操作:
string uniqueURL = "your unique text in URL of the tab you want to keep";
var windowHandles = driver.WindowHandles;
if(windowHandles.Count > 1)
{
foreach(var tab in windowHandles)
{
driver.SwitchTo().Window(tab);
if(!driver.Url.Contains(uniqueURL))
{
driver.Close();
}
}
driver.SwitchTo().Window(driver.WindowHandles.First());
}
此代码适用于 Java
的 seleniumArrayList<String> switchTabs= new ArrayList<String> (driver.getWindowHandles());
driver.switchTo().window(switchTabs.get(1));
driver.close();
driver.switchTo().window(switchTabs.get(0));
注意:根据您的要求关闭选项卡