2016-04-03 18 views
-1

index.jspには3つのハイパーリンク(gmail、google、Facebook、javaチュートリアル)があります。クリックごとに)。私のコードで間違ったことを助けてくれる人がいますか?Selenum2:ハイパーリンクをクリックすると同じウィンドウハンドルが表示される

index.jspを

<%@ page language="java" contentType="text/html; charset=UTF-8" 
pageEncoding="UTF-8"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>Selenium Tutorial</title> 
</head> 

<body> 
    <h1> 
     <a href="https://mail.google.com" target="_blank">gmail</a> 
    </h1> 
<h1> 
    <a href="https://www.google.co.in" target="_blank">google</a> 
</h1> 
<h1> 
    <a href="https://www.facebook.com/" target="_blank">facebook</a> 
</h1> 
<h1> 
    <a href="http://self-learning-java-tutorial.blogspot.in/" 
     target="_blank">Java Tutorial</a> 
</h1> 

App.java

import java.io.IOException; 

import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebElement; 
import org.openqa.selenium.firefox.FirefoxDriver; 

public class App { 
    public static void waitForNumberOfWindowsToEqual(final WebDriver driver, final int numberOfWindows) { 

     while (driver.getWindowHandles().size() != numberOfWindows) { 

     } 
    } 

    public static void main(String[] args) throws IOException, InterruptedException { 
     WebDriver driver = new FirefoxDriver(); 
     driver.get("http://localhost:8080/application/index.jsp"); 

     WebElement gmail = driver.findElement(By.linkText("gmail")); 
     WebElement javaTutorial = driver.findElement(By.partialLinkText("Tutorial")); 

     String mainWindow = driver.getWindowHandle(); 
     System.out.println("mainWindow handle " + mainWindow); 
     System.out.println("Total handles " + driver.getWindowHandles().size()); 

     gmail.click(); 
     waitForNumberOfWindowsToEqual(driver, 2); 
     String gmailWindow = driver.getWindowHandle(); 
     System.out.println("gmailWindow handle " + gmailWindow); 
     System.out.println("Total handles " + driver.getWindowHandles().size()); 

     javaTutorial.click(); 
     waitForNumberOfWindowsToEqual(driver, 3); 
     String javaTutorialWindow = driver.getWindowHandle(); 
     System.out.println("javaTutorialWindow handle " + javaTutorialWindow); 
     System.out.println("Total handles " + driver.getWindowHandles().size()); 

     driver.quit(); 
    } 
} 

出力

mainWindow handle {c0582dd6-8cab-b14c-8820-8d8ef12f8658} 
Total handles 1 
gmailWindow handle {c0582dd6-8cab-b14c-8820-8d8ef12f8658} 
Total handles 2 
javaTutorialWindow handle {c0582dd6-8cab-b14c-8820-8d8ef12f8658} 
Total handles 3 

答えて

1

新しいウィンドウを開くと、ウィンドウのコンテキストは変更されません。新しいウィンドウが開いても、同じハンドルがdriver.getWindowHandle()メソッドによって返されます。新しく開かれたウィンドウと対話するには、明示的にコンテキストを対象ウィンドウに設定する必要があります。具体的にはdriver.switchTo().window(handle);です。

この例では、ドライバがそれと対話できるように、新しいウィンドウのコンテキストを設定しています。最後のウィンドウを取得しようとしていること

WebDriver driver = new ChromeDriver(); 
WebDriverWait wait = new WebDriverWait(driver, 20); 

// open the url 
driver.get("http://stackoverflow.com/"); 

// open a link in a new window with Ctrl + Click 
new Actions(driver) 
    .keyDown(Keys.CONTROL) 
    .click(driver.findElement(By.id("nav-questions"))) 
    .perform(); 

// wait for 2 windows 
wait.until(ExpectedConditions.numberOfWindowsToBe(2)); 

// set the context on the new window 
Set<String> handles = driver.getWindowHandles(); 
handles.remove(driver.getWindowHandle()); 
driver.switchTo().window(handles.iterator().next()); 

// display the title of the new window 
System.out.println("Page title: " + driver.getTitle()); 

// quit 
driver.quit(); 

注意をによってセットの最後のハンドルを取得して信頼性がありません

Get Window Handlesコマンドは、開いているすべてのトップレベルブラウズコンテキストのウィンドウハンドルのリストを返します。ウィンドウハンドルが返される順序は任意です。返信用

https://www.w3.org/TR/webdriver/#get-window-handles

1

driver.getWindowHandle();現在フォーカスされているウィンドウのウィンドウハンドルを返します。あなたが最後にあなたがするたびにリストアップし、インデックスでそれを得るために、現在のウィンドウを追加することができ、ウィンドウを開いた場合、すべてのウィンドウハンドルが複数

for (String handle : driver.getWindowHandles()) { 
    System.out.println(handle); 
} 

driver.getWindowHandles()を使用取得するには

List<String> handles = new List<String>(); 

// open new window 

for (String handle : driver.getWindowHandles()) { 
    if (!handles.contains(handle)) { // add the newly opened window 
     handles.add(handle); 
    } 
} 

// open the next window and repeat the loop (you can make a method) 

handlesていますウィンドウが作成された順に処理されます。最後のwindoeを取得する

System.out.println("Last handle " + handles.get(handles.size() - 1)); 
+0

感謝。 getWindowHandlesメソッドはSetを返し、SetはLinkedHashSetを使用しない限り順序を保持しません。 HtmlUnitDriver.javaのソースコードを調べると、HashSet(Not LinkedHashSet)を使用してgetWindowHandles関数が実装されます。最後に開いたウィンドウハンドルを取得するための他の一般的な方法はありますか? –

+0

@ user3302424私は自分の答えを編集しました。 – Guy

関連する問題