Durumum var, düğmeye tıklandığında arama sonuçlarıyla yeni tarayıcı penceresi açılıyor.
Yeni açılan tarayıcı penceresine bağlanmanın ve ona odaklanmanın bir yolu var mı?
Ve bununla çalışın, ardından orijinal (ilk) pencereye geri dönün.
Durumum var, düğmeye tıklandığında arama sonuçlarıyla yeni tarayıcı penceresi açılıyor.
Yeni açılan tarayıcı penceresine bağlanmanın ve ona odaklanmanın bir yolu var mı?
Ve bununla çalışın, ardından orijinal (ilk) pencereye geri dönün.
Yanıtlar:
Aşağıdaki gibi pencereler arasında geçiş yapabilirsiniz:
// 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()
bir Set döndürür ve bir Set sıralamayı garanti etmez . Son öğe her zaman son pencere değildir. Yorumunun çok fazla olumlu oy almasına şaşırdım.
getWindowHandles()
. Yöntemin ve özellikle Java Set <T> 'nin bilinen bir davranışıdır (hata değildir). Bu nedenle switchTo().window(handles[handles.length-1])
Java'da garanti edilmez. AC # çözümünün doğru olduğu iddia edilemez.
Sadece içeriğe eklemek için ...
Ana pencereye geri dönmek için (varsayılan pencere).
kullanım driver.switchTo().defaultContent();
Bu komut dosyası, bir arta geçiş için yardımcı Veli penceresine bir etmek Çocuk pencereye Veli penceresine ve arka CNTRL
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, iki nedenden ötürü senin yolun işe yaramayacak:
Kaynak: Selenium WebDriver windows anahtarlama sorunu Internet Explorer 8-10'da
Benim durumum için, IE kayıt defteri düzenlemesinden sonra yeni pencere tutamaçları algılamaya başladı.
Sekme İşlemi Büyümesi: IE'nin Yeni Sekme işlemlerini oluşturma hızını ayarlar.
"Maksimum Sayı" algoritması: Bu, belirli bir zorunlu bütünlük seviyesinde (MIC) tek bir çerçeve işlemi için tek bir izolasyon oturumu için yürütülebilecek maksimum sekme işlemi sayısını belirtir. Göreli değerler şunlardır:
- TabProcGrowth = 0: sekmeler ve çerçeveler aynı işlem içinde çalışır; çerçeveler, MIC seviyelerinde birleştirilmez.
- TabProcGrowth = 1: belirli bir çerçeve işleminin tüm sekmeleri, belirli bir MIC düzeyi için tek bir sekme işleminde çalışır.
Kaynak: Yeni Bir Sekme Açmak, Internet Explorer 8.0 ile Yeni İşlem Başlatabilir
Tarayıcı: IE11 x64 (Yakınlaştırma:% 100)
İşletim Sistemi: 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);
Yukarıdaki kod, Set<T>
Java'da garantili sıralama olmadığı için ana pencereye geçmediğinizden emin olmak için bir if-check içerir . WebDriverWait
Aşağıdaki ifadeyle desteklendiği üzere başarı şansını artırdığı görülmektedir.
Tarayıcının yeni pencereyi kabul etmesi zaman alabilir ve açılır pencere görünmeden önce switchTo () döngünüze düşüyor olabilirsiniz.
GetWindowHandles () tarafından döndürülen son pencerenin açılan son pencere olacağını otomatik olarak varsayarsınız. Herhangi bir sırayla iade edilmeleri garanti edilmediğinden, bu mutlaka doğru değildir.
Kaynak: IE'de bir açılır pencere işlenemiyor, denetim açılır pencereye aktarılmıyor
Kullanabilirsin:
driver.SwitchTo().Window(WindowName);
Burada PencereAdı, odağı değiştirmek istediğiniz pencerenin adını temsil eden bir dizedir. İşiniz bittiğinde geri dönmek için bu işlevi orijinal pencerenin adıyla tekrar çağırın.
Çeşitli pencere tutamaçlarını saklamak için yineleyici ve bir süre döngüsü kullanıyorum ve sonra ileri geri gidiyorum.
//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);
}
Dolayısıyla, bu çözümlerin çoğuyla ilgili sorun, pencerenin anında göründüğünü varsaymanızdır (hiçbir şey anında olmaz ve işler IE'de önemli ölçüde daha az anında olur). Ayrıca, öğeye tıklamadan önce yalnızca bir pencere olacağını varsayarsınız, bu her zaman böyle değildir. Ayrıca IE, pencere tutamaçlarını tahmin edilebilir bir sırada döndürmez. Bu yüzden aşağıdakileri yapardım.
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();
}
Birden fazla tarayıcınız varsa (java 8 kullanarak)
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);
}
}