मेरे पास स्थिति है, जब बटन पर क्लिक करने से खोज परिणामों के साथ नई ब्राउज़र विंडो खुलती है।
क्या नई खुली ब्राउज़र विंडो से जुड़ने और फ़ोकस करने का कोई तरीका है?
और इसके साथ काम करें, फिर मूल (पहले) विंडो पर वापस जाएं।
मेरे पास स्थिति है, जब बटन पर क्लिक करने से खोज परिणामों के साथ नई ब्राउज़र विंडो खुलती है।
क्या नई खुली ब्राउज़र विंडो से जुड़ने और फ़ोकस करने का कोई तरीका है?
और इसके साथ काम करें, फिर मूल (पहले) विंडो पर वापस जाएं।
जवाबों:
आप नीचे दी गई खिड़कियों के बीच स्विच कर सकते हैं:
// 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()
एक सेट लौटाता है और एक सेट ऑर्डर करने की गारंटी नहीं देता है । अंतिम तत्व हमेशा अंतिम विंडो नहीं होता है। मुझे आश्चर्य है कि उनकी टिप्पणी से बहुत उभार आया।
getWindowHandles()
। यह विधि का एक ज्ञात व्यवहार (बग नहीं) है और विशेष रूप से जावा सेट <टी> है। इसलिए, switchTo().window(handles[handles.length-1])
जावा में गारंटी नहीं है। AC # समाधान के सही होने का दावा नहीं किया जा सकता है।
बस सामग्री में जोड़ने के लिए ...
मुख्य विंडो (डिफ़ॉल्ट विंडो) पर वापस जाने के लिए।
उपयोग driver.switchTo().defaultContent();
यह स्क्रिप्ट आपको पेरेंट विंडो से चाइल्ड विंडो और बैक कॉन्ट्रेल से पेरेंट विंडो पर स्विच करने में मदद करती है
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
}
}
सूर्या, आपका काम नहीं चलेगा, दो कारणों से:
स्रोत: इंटरनेट एक्सप्लोरर 8-10 में सेलेनियम वेबड्राइवर विंडोज़ स्विचिंग समस्या
मेरे मामले के लिए, IE ने रजिस्ट्री संपादन के बाद नए विंडो हैंडल का पता लगाना शुरू किया।
टैब प्रोसेस ग्रोथ: वह दर सेट करता है जिस पर IE नई टैब प्रक्रिया बनाता है।
"मैक्स-नंबर" एल्गोरिथ्म: यह एक विशिष्ट अनिवार्य अखंडता स्तर (एमआईसी) पर एकल फ्रेम प्रक्रिया के लिए एकल अलगाव सत्र के लिए निष्पादित की जा सकने वाली टैब प्रक्रियाओं की अधिकतम संख्या को निर्दिष्ट करता है। सापेक्ष मूल्य हैं:
- TabProcGrowth = 0: टैब और फ़्रेम एक ही प्रक्रिया के भीतर चलते हैं; फ़्रेम एमआईसी स्तरों में एकीकृत नहीं हैं।
- TabProcGrowth = 1: किसी दिए गए MIC प्रक्रिया के लिए एकल टैब प्रक्रिया में दी गई फ़्रेम प्रक्रिया के लिए सभी टैब।
स्रोत: नया टैब खोलने पर इंटरनेट एक्सप्लोरर 8.0 के साथ एक नई प्रक्रिया शुरू हो सकती है
ब्राउज़र: IE11 x64 (ज़ूम: 100%)
OS: विंडोज 7 x64
सेलेनियम: 3.5.1 वेबड्राइवर
: 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);
उपरोक्त कोड में एक if-check शामिल है यह सुनिश्चित करने के लिए कि आप मूल विंडो पर स्विच नहीं कर रहे हैं क्योंकि Set<T>
जावा में कोई गारंटी आदेश नहीं है । WebDriverWait
नीचे दिए गए बयान के अनुसार सफलता की संभावना बढ़ जाती है।
ब्राउज़र को नई विंडो को स्वीकार करने में समय लग सकता है, और पॉपअप विंडो दिखाई देने से पहले आप अपने स्विचटॉ () लूप में गिर सकते हैं।
आप स्वचालित रूप से मान लेते हैं कि getWindowHandles () द्वारा दी गई अंतिम विंडो खोली गई अंतिम होगी। यह जरूरी नहीं कि सच हो, क्योंकि उन्हें किसी भी क्रम में वापस करने की गारंटी नहीं है।
स्रोत: IE में एक पॉपअप को संभालने में असमर्थ, नियंत्रण पॉपअप विंडो में स्थानांतरित नहीं हो रहा है
आप उपयोग कर सकते हैं:
driver.SwitchTo().Window(WindowName);
जहां WindowName एक स्ट्रिंग है, जिस विंडो का नाम आप फोकस पर स्विच करना चाहते हैं। इस फ़ंक्शन को मूल विंडो के नाम के साथ फिर से कॉल करें जब आप इसे पूरा कर लें।
मैं विभिन्न विंडो हैंडल को स्टोर करने के लिए इटरेटर और थोड़ी देर के लूप का उपयोग करता हूं और फिर आगे और पीछे स्विच करता हूं।
//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);
}
तो इन समाधानों के साथ समस्या यह है कि आप मान रहे हैं कि खिड़की तुरंत दिखाई देती है (कुछ भी नहीं होता है, और आईई में चीजें काफी कम होती हैं)। आप यह भी मान रहे हैं कि तत्व पर क्लिक करने से पहले केवल एक खिड़की होगी, जो हमेशा ऐसा नहीं होता है। इसके अलावा IE एक अनुमानित क्रम में खिड़की के हैंडल को वापस नहीं करेगा। तो मैं निम्नलिखित करूँगा।
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();
}
यदि आपके पास अधिक है तो एक ब्राउज़र (जावा 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);
}
}