getWindowHandle()Selenium Webdriver Javascript
根据工程部的帮助进行了一些更改。下面是我用来抓取新窗口句柄的最后一个代码:getWindowHandle()Selenium Webdriver Javascript,javascript,selenium,coffeescript,Javascript,Selenium,Coffeescript,根据工程部的帮助进行了一些更改。下面是我用来抓取新窗口句柄的最后一个代码: localdriver = @driver @driver.getAllWindowHandles() .then (handles) -> localdriver.switchTo().window(handles[1]) 我目前正在运行一个使用SeleniumWebDriver、Mocha、Chai和Grunt的自动化堆栈。我正在用Coffeescript创建脚本,但是用Javascript回答我的问
localdriver = @driver
@driver.getAllWindowHandles()
.then (handles) ->
localdriver.switchTo().window(handles[1])
我目前正在运行一个使用SeleniumWebDriver、Mocha、Chai和Grunt的自动化堆栈。我正在用Coffeescript创建脚本,但是用Javascript回答我的问题就可以了
localdriver = @driver
@driver.getAllWindowHandles()
.then (handles) ->
localdriver.switchTo().window(handles[1])
我想做的是:
localdriver = @driver
@driver.getAllWindowHandles()
.then (handles) ->
localdriver.switchTo().window(handles[1])
- 单击主浏览器窗口上的按钮
- 将驱动程序切换到单击按钮后打开的第二个窗口
- 在第二个窗口中执行操作
- 关闭第二个窗口并返回第一个窗口
我在互联网上搜索,寻找如何做到这一点的答案。几个月前我才开始学习所有这些东西,但我仍然在创作这些东西。我看到了很多Java和C+示例,但Javascript方面的示例并不多。任何人都可以提供一个如何使用Selenium Webdriver和Javascript为上述场景设置代码的示例吗?您需要的是driver.getAllWindowHandles(),但由于这会返回一个承诺,请确保使用
then
函数中的句柄
localdriver = @driver
@driver.getAllWindowHandles()
.then (handles) ->
localdriver.switchTo().window(handles[1])
var parent = driver.getWindowHandle();
var windows = driver.getAllWindowHandles();
driver.switchTo().window(windows[1]);
// do some stuff
driver.close();
driver.switchTo().window(parent);
// select the newly opened window
driver.getAllWindowHandles().then(function gotWindowHandles(allhandles) {
driver.switchTo().window(allhandles[allhandles.length - 1]);
});
每当新选项卡打开时,都需要一些时间来显示和渲染。在这种情况下,很难切换该选项卡,因为该选项卡尚未打开,并且
driver.getAllWindowHandles()
不会为该选项卡提供处理程序。我用这种方式解决了这个问题,我假设我有一个打开的选项卡,点击一些按钮,我打开了新的第二个选项卡
localdriver = @driver
@driver.getAllWindowHandles()
.then (handles) ->
localdriver.switchTo().window(handles[1])
function openNewTab(driver) {
driver.wait(function () {
return driver.getAllWindowHandles().then(function (handles) {
var isHandleCount2 = (handles.length == 2);
if (isHandleCount2) {
driver.switchTo().window(handles[1]);
}
return isHandleCount2;
});
}).then(function () {
// Now do some stuff in new tab
var buttonElement = driver.wait(until.elementLocated(By.xpath("//td[*//span[text()='Click me']]")));
buttonElement.click();
});
}
此代码将等待句柄或选项卡的数量不等于2。@Jai-Prak的答案很好。
如果有三个或更多选项卡,情况会如何
最新选项卡将始终是最后一个选项卡
localdriver = @driver
@driver.getAllWindowHandles()
.then (handles) ->
localdriver.switchTo().window(handles[1])
return await driver.wait(async function () {
return await driver.getAllWindowHandles().then(async function (handles) {
// var isHandleCount2 = (handles.length == 2);
if (handles.length > 1) {
return driver.switchTo().window(handles[handles.length - 1]);
}
return false;
});
}).then(function () {
// Now do some stuff in new tab
});
除非您在选项卡之间切换,否则上述操作将适用。
要移动下一个选项卡,请获取当前选项卡的
索引-1
驱动程序。getWindowHandles()不是一个函数,您确定吗?它仍然在selenium文档页面上引用:您正在查看java文档。在JavaScript中,正确的方法是driver.getAllWindowHandles()
Thank you@Jeremy DeerAngel org,我一直在追查这方面的进展hours@JeremyMoritz我认为必须改变公认的答案以反映这一点。不管怎样,您是在哪里找到有关getAllWindowHandles
的信息的。我可以找到任何包含此节点的函数列表的文档?嗨,我尝试了你的代码,但它说“getAllWindowHandles不是…”中的函数@Ragnarsson我不确定在你的特定情况下发生了什么。知道这一点可能不舒服,但它在我的机器上工作。不幸的是,我使用该代码已经两年了,所以现在无法对其进行故障排除:-/@Ragnarssonawait driver.getAllWindowHandles().then(异步(allhandles)=>{return await driver.switchTo().window(allhandles[allhandles.length-1]);})代码>这太棒了:+1。两个或更多选项卡的情况如何?最新选项卡将始终是最后一个选项卡。我做了一些细微的更改:return-await-driver.wait(异步函数(){return-await-driver.getAllWindowHandles().then(异步函数(handles){if(handles.length>1){return-driver.switchTo().window(handles[handles.length-1]);}return false;}然后(函数(){})代码>
localdriver = @driver
@driver.getAllWindowHandles()
.then (handles) ->
localdriver.switchTo().window(handles[1])