ฉันมีสถานการณ์เมื่อคลิกที่ปุ่มเปิดหน้าต่างเบราว์เซอร์ใหม่พร้อมผลการค้นหา
มีวิธีใดบ้างในการเชื่อมต่อและโฟกัสไปที่หน้าต่างเบราว์เซอร์ที่เปิดใหม่
และใช้งานได้จากนั้นกลับไปที่หน้าต่างเดิม (แรก)
ฉันมีสถานการณ์เมื่อคลิกที่ปุ่มเปิดหน้าต่างเบราว์เซอร์ใหม่พร้อมผลการค้นหา
มีวิธีใดบ้างในการเชื่อมต่อและโฟกัสไปที่หน้าต่างเบราว์เซอร์ที่เปิดใหม่
และใช้งานได้จากนั้นกลับไปที่หน้าต่างเดิม (แรก)
คำตอบ:
คุณสามารถสลับไปมาระหว่างหน้าต่างดังต่อไปนี้:
// 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()
เกี่ยวกับ เป็นพฤติกรรมที่ทราบ (ไม่ใช่จุดบกพร่อง) ของเมธอดและ Java Set <T> โดยเฉพาะ ดังนั้นจึงswitchTo().window(handles[handles.length-1])
ไม่รับประกันใน Java ไม่สามารถอ้างว่าโซลูชัน AC # ถูกต้อง
เพียงเพื่อเพิ่มเนื้อหา ...
เพื่อกลับไปที่หน้าต่างหลัก (หน้าต่างเริ่มต้น)
ใช้ driver.switchTo().defaultContent();
สคริปต์นี้ช่วยให้คุณสามารถเปลี่ยนจากหน้าต่างหลักเป็นหน้าต่างลูกและกลับ 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 วิธีของคุณไม่ได้ผลเนื่องจากเหตุผลสองประการ:
ที่มา: ปัญหาการสลับหน้าต่าง Selenium WebDriver ใน Internet Explorer 8-10
ในกรณีของฉัน IE เริ่มตรวจพบตัวจัดการหน้าต่างใหม่หลังจากแก้ไขรีจิสทรี
Tab Process Growth:กำหนดอัตราที่ IE สร้างกระบวนการ New Tab
อัลกอริทึม "Max-Number": ระบุจำนวนสูงสุดของกระบวนการแท็บที่อาจดำเนินการสำหรับเซสชันการแยกเดี่ยวสำหรับกระบวนการเฟรมเดียวที่ระดับความสมบูรณ์บังคับเฉพาะ (MIC) ค่าสัมพัทธ์คือ:
- TabProcGrowth = 0: แท็บและเฟรมทำงานภายในกระบวนการเดียวกัน เฟรมไม่รวมกันในระดับ MIC
- TabProcGrowth = 1: แท็บทั้งหมดสำหรับกระบวนการเฟรมที่กำหนดทำงานในกระบวนการแท็บเดียวสำหรับระดับ MIC ที่กำหนด
ที่มา: การ เปิดแท็บใหม่อาจทำให้เกิดกระบวนการใหม่ด้วย Internet Explorer 8.0
เบราว์เซอร์: IE11 x64 (ซูม: 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);
รหัสข้างต้นรวมถึงถ้าตรวจสอบให้แน่ใจว่าคุณจะไม่ได้เปลี่ยนไปยังหน้าต่างหลักเป็นได้รับประกันไม่มีการสั่งซื้อในชวาSet<T>
WebDriverWait
ดูเหมือนจะเพิ่มโอกาสในการประสบความสำเร็จตามที่ได้รับการสนับสนุนจากข้อความด้านล่าง
เบราว์เซอร์อาจใช้เวลาในการรับทราบหน้าต่างใหม่และคุณอาจตกอยู่ในลูป switchTo () ก่อนที่หน้าต่างป๊อปอัปจะปรากฏขึ้น
คุณจะถือว่าหน้าต่างสุดท้ายที่ส่งคืนโดย getWindowHandles () จะเป็นหน้าต่างสุดท้ายที่เปิดโดยอัตโนมัติ ไม่จำเป็นต้องเป็นจริงเนื่องจากไม่รับประกันว่าจะได้รับคืนตามลำดับ
ที่มา: ไม่สามารถจัดการกับป๊อปอัปใน IE การควบคุมไม่ได้ถ่ายโอนไปยังหน้าต่างป๊อปอัป
คุณสามารถใช้:
driver.SwitchTo().Window(WindowName);
โดยที่ WindowName คือสตริงที่แสดงถึงชื่อของหน้าต่างที่คุณต้องการเปลี่ยนโฟกัส เรียกใช้ฟังก์ชันนี้อีกครั้งด้วยชื่อของหน้าต่างเดิมเพื่อกลับไปที่เมื่อคุณทำเสร็จแล้ว
ฉันใช้ iterator และ while loop เพื่อจัดเก็บที่จับหน้าต่างต่างๆแล้วสลับไปมา
//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) นอกจากนี้คุณกำลังสมมติว่าจะมีเพียงหน้าต่างเดียวก่อนที่จะคลิกองค์ประกอบซึ่งไม่ได้เป็นเช่นนั้นเสมอไป 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();
}
หากคุณมีมากกว่าหนึ่งเบราว์เซอร์ (โดยใช้ 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);
}
}