Saya punya situasi, ketika mengklik tombol membuka jendela browser baru dengan hasil pencarian.
Apakah ada cara untuk menghubungkan dan fokus ke jendela browser yang baru dibuka?
Dan bekerja dengannya, lalu kembali ke jendela asli (pertama).
Saya punya situasi, ketika mengklik tombol membuka jendela browser baru dengan hasil pencarian.
Apakah ada cara untuk menghubungkan dan fokus ke jendela browser yang baru dibuka?
Dan bekerja dengannya, lalu kembali ke jendela asli (pertama).
Jawaban:
Anda dapat beralih antar jendela seperti di bawah ini:
// Store the current window handle
String winHandleBefore = driver.getWindowHandle();
// Perform the click operation that opens new window
// Switch to new window opened
for(String winHandle : driver.getWindowHandles()){
driver.switchTo().window(winHandle);
}
// Perform the actions on new window
// Close the new window, if that window no more required
driver.close();
// Switch back to original browser (first window)
driver.switchTo().window(winHandleBefore);
// Continue with original browser (first window)
getWindowHandles()
mengembalikan Set dan Set tidak menjamin pengurutan . Elemen terakhir tidak selalu merupakan jendela terakhir. Saya terkejut komentarnya mendapat banyak upvote.
getWindowHandles()
. Ini adalah perilaku yang diketahui (bukan bug) dari metode ini dan Java Set <T> pada khususnya. Oleh karena itu, switchTo().window(handles[handles.length-1])
tidak dijamin di Jawa. Solusi AC # tidak dapat diklaim sebagai benar.
Hanya untuk menambah konten ...
Untuk kembali ke jendela utama (jendela default).
menggunakan driver.switchTo().defaultContent();
Script ini membantu Anda untuk beralih dari jendela Parent ke jendela Child dan kembali cntrl ke jendela Parent
String parentWindow = driver.getWindowHandle();
Set<String> handles = driver.getWindowHandles();
for(String windowHandle : handles)
{
if(!windowHandle.equals(parentWindow))
{
driver.switchTo().window(windowHandle);
<!--Perform your operation here for new window-->
driver.close(); //closing child window
driver.switchTo().window(parentWindow); //cntrl to parent window
}
}
Surya, caramu tidak akan berhasil, karena dua alasan:
Sumber: Masalah peralihan jendela Selenium WebDriver di Internet Explorer 8-10
Untuk kasus saya, IE mulai mendeteksi jendela baru menangani setelah mengedit registri.
Pertumbuhan Proses Tab: Menyetel tingkat di mana IE membuat proses Tab Baru.
Algoritme "Max-Number": Ini menentukan jumlah maksimum proses tab yang dapat dijalankan untuk sesi isolasi tunggal untuk proses bingkai tunggal pada tingkat integritas wajib tertentu (MIC). Nilai relatifnya adalah:
- TabProcGrowth = 0: tab dan bingkai berjalan dalam proses yang sama; bingkai tidak disatukan di seluruh level MIC.
- TabProcGrowth = 1: semua tab untuk proses bingkai tertentu berjalan dalam satu proses tab untuk level MIC tertentu.
Sumber: Membuka Tab Baru dapat meluncurkan Proses Baru dengan Internet Explorer 8.0
Browser: IE11 x64 (Zoom: 100%)
OS: Windows 7 x64
Selenium: 3.5.1
WebDriver: IEDriverServer x64 3.5.1
public static String openWindow(WebDriver driver, By by) throws IOException {
String parentHandle = driver.getWindowHandle(); // Save parent window
WebElement clickableElement = driver.findElement(by);
clickableElement.click(); // Open child window
WebDriverWait wait = new WebDriverWait(driver, 10); // Timeout in 10s
boolean isChildWindowOpen = wait.until(ExpectedConditions.numberOfWindowsToBe(2));
if (isChildWindowOpen) {
Set<String> handles = driver.getWindowHandles();
// Switch to child window
for (String handle : handles) {
driver.switchTo().window(handle);
if (!parentHandle.equals(handle)) {
break;
}
}
driver.manage().window().maximize();
}
return parentHandle; // Returns parent window if need to switch back
}
/* How to use method */
String parentHandle = Selenium.openWindow(driver, by);
// Do things in child window
driver.close();
// Return to parent window
driver.switchTo().window(parentHandle);
Kode di atas menyertakan if-check untuk memastikan Anda tidak beralih ke jendela induk karena Set<T>
tidak ada jaminan pemesanan di Java . WebDriverWait
tampaknya meningkatkan peluang sukses seperti yang didukung oleh pernyataan di bawah ini.
Browser mungkin memerlukan waktu untuk menerima jendela baru, dan Anda mungkin masuk ke loop switchTo () sebelum jendela popup muncul.
Anda secara otomatis berasumsi bahwa jendela terakhir yang dikembalikan oleh getWindowHandles () akan menjadi yang terakhir dibuka. Itu belum tentu benar, karena tidak dijamin akan dikembalikan dalam urutan apa pun.
Sumber: Tidak dapat menangani popup di IE, kontrol tidak mentransfer ke jendela popup
Anda bisa menggunakan:
driver.SwitchTo().Window(WindowName);
Di mana WindowName adalah string yang mewakili nama jendela yang ingin Anda alihkan fokusnya. Panggil fungsi ini lagi dengan nama jendela asli untuk kembali ke fungsi ini setelah Anda selesai.
Saya menggunakan iterator dan while loop untuk menyimpan berbagai pegangan jendela dan kemudian beralih bolak-balik.
//Click your link
driver.findElement(By.xpath("xpath")).click();
//Get all the window handles in a set
Set <String> handles =driver.getWindowHandles();
Iterator<String> it = handles.iterator();
//iterate through your windows
while (it.hasNext()){
String parent = it.next();
String newwin = it.next();
driver.switchTo().window(newwin);
//perform actions on new window
driver.close();
driver.switchTo().window(parent);
}
main you can do :
String mainTab = page.goToNewTab ();
//do what you want
page.backToMainPage(mainTab);
What you need to have in order to use the main
private static Set<String> windows;
//get all open windows
//return current window
public String initWindows() {
windows = new HashSet<String>();
driver.getWindowHandles().stream().forEach(n -> windows.add(n));
return driver.getWindowHandle();
}
public String getNewWindow() {
List<String> newWindow = driver.getWindowHandles().stream().filter(n -> windows.contains(n) == false)
.collect(Collectors.toList());
logger.info(newWindow.get(0));
return newWindow.get(0);
}
public String goToNewTab() {
String startWindow = driver.initWindows();
driver.findElement(By.cssSelector("XX")).click();
String newWindow = driver.getNewWindow();
driver.switchTo().window(newWindow);
return startWindow;
}
public void backToMainPage(String startWindow) {
driver.close();
driver.switchTo().window(startWindow);
}
Jadi masalah dengan banyak solusi ini adalah Anda mengasumsikan jendela muncul secara instan (tidak ada yang terjadi secara instan, dan hal-hal terjadi secara signifikan lebih sedikit di IE). Juga Anda berasumsi bahwa hanya akan ada satu jendela sebelum mengklik elemen, yang tidak selalu terjadi. Juga IE tidak akan mengembalikan pegangan jendela dalam urutan yang dapat diprediksi. Jadi saya akan melakukan hal berikut.
public String clickAndSwitchWindow(WebElement elementToClick, Duration
timeToWaitForWindowToAppear) {
Set<String> priorHandles = _driver.getWindowHandles();
elementToClick.click();
try {
new WebDriverWait(_driver,
timeToWaitForWindowToAppear.getSeconds()).until(
d -> {
Set<String> newHandles = d.getWindowHandles();
if (newHandles.size() > priorHandles.size()) {
for (String newHandle : newHandles) {
if (!priorHandles.contains(newHandle)) {
d.switchTo().window(newHandle);
return true;
}
}
return false;
} else {
return false;
}
});
} catch (Exception e) {
Logging.log_AndFail("Encountered error while switching to new window after clicking element " + elementToClick.toString()
+ " seeing error: \n" + e.getMessage());
}
return _driver.getWindowHandle();
}
Jika Anda memiliki lebih dari satu browser (menggunakan java 8)
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class TestLink {
private static Set<String> windows;
public static void main(String[] args) {
WebDriver driver = new FirefoxDriver();
driver.get("file:///C:/Users/radler/Desktop/myLink.html");
setWindows(driver);
driver.findElement(By.xpath("//body/a")).click();
// get new window
String newWindow = getWindow(driver);
driver.switchTo().window(newWindow);
// Perform the actions on new window
String text = driver.findElement(By.cssSelector(".active")).getText();
System.out.println(text);
driver.close();
// Switch back
driver.switchTo().window(windows.iterator().next());
driver.findElement(By.xpath("//body/a")).click();
}
private static void setWindows(WebDriver driver) {
windows = new HashSet<String>();
driver.getWindowHandles().stream().forEach(n -> windows.add(n));
}
private static String getWindow(WebDriver driver) {
List<String> newWindow = driver.getWindowHandles().stream()
.filter(n -> windows.contains(n) == false).collect(Collectors.toList());
System.out.println(newWindow.get(0));
return newWindow.get(0);
}
}