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).
java
selenium
selenium-webdriver
webdriver
new-window
Volodymyr Prysiazhniuk
sumber
sumber
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)
sumber
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();
sumber
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 } }
sumber
Surya, caramu tidak akan berhasil, karena dua alasan:
sumber
Ubah registri untuk IE:
Sumber: Masalah peralihan jendela Selenium WebDriver di Internet Explorer 8-10
Untuk kasus saya, IE mulai mendeteksi jendela baru menangani setelah mengedit registri.
Diambil dari Blog MSDN:
Pilihan internet:
Kode:
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.Dikutip dari Luke Inman-Semerau : (Pengembang untuk Selenium)
Posting terkait:
sumber
Anda bisa menggunakan:
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.
sumber
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); }
sumber
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); }
sumber
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(); }
sumber
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); } }
sumber