2012-03-30 85 views
26
<div>  
    <iframe id="cq-cf-frame ">  
    <iframe id="gen367"> 
     <body spellcheck="false" id="CQrte" style="height: 255px; font-size: 12px; font-family:tahoma,arial,helvetica,sans-serif; background-image: url(&quot;/libs/cq/ui/widgets/themes/default/ext/form/text-bg.gif&quot;); background-repeat: repeat-x; background-attachment: fixed;"> 
     <p>4t43t4<br></p> 
     </body > 
    </iframe> 
    </iframe>  
</div> 

Trong trường hợp này có iframe dưới iframe. Và tôi phải chọn bên ngoài iframe để chuyển đến bên trong iframe và viết nội dung nằm bên trong iframe.Cách xử lý khung nội tuyến trong Selenium WebDriver bằng cách sử dụng java

Tiếp theo, tôi phải thoát ra từ bên trong iframe đến bên ngoài iframe và nhấp vào nút OK, (nằm ở bên ngoài iframe).

Sau đây là mã của tôi

/*Line 1 */ driver.switchTo().frame("cq-cf-frame"); 
/*  2 */ driver.findElement(By.css("#extdd-9 > div.tblRow > input.edititem").click(); 
/*  3 */ driver.switchT().Frame("cq-gen379"); 
/*  4 */ driver.findElement(By.id("CQrte").sendKeys("Tnx"); 
/*  5 */ selenium.selectFrame("relative=up");  
/*  6 */ driver.findElement(By.xpath("//button[text()='OK']")).click(); 

Sau đây là vấn đề của tôi:

mã kiểm tra của tôi đang làm việc tốt lên đến hàng số 4 tức là viết vào cơ thể, nhưng tôi muốn đến từ bên trong ra bên ngoài iframe nó nói rằng phần tử //button[text()='OK'] không được tìm thấy.

Tôi đã thử sử dụng chỉ mục, cha mẹ, người thân, nhưng không có may mắn.

LƯU Ý: Nếu tôi không chọn khung bên trong (cq-gen379). Tôi có thể bấm vào nút OK.

Trả lời

36

Trong Webdriver, bạn nên sử dụng driver.switchTo().defaultContent(); thoát ra khỏi một khung. Bạn cần phải thoát ra khỏi tất cả các khung hình đầu tiên, sau đó chuyển sang khung bên ngoài một lần nữa.

// between step 4 and step 5 
// remove selenium.selectFrame("relative=up"); 
driver.switchTo().defaultContent(); // you are now outside both frames 
driver.switchTo().frame("cq-cf-frame"); 
// now continue step 6 
driver.findElement(By.xpath("//button[text()='OK']")).click(); 
+0

Ngoài ra, như là một FYI: Tôi đã tìm thấy rằng switchTo(). Khung cần phải chờ đợi tiềm ẩn disactivated: driver.manage(). Timeouts(). ImplicitlyWait (0, TimeUnit.SECONDS); – JohnP2

30

Bạn có để có được trở lại ra khỏi khung nội tuyến với đoạn mã sau:

driver.switchTo().frame(driver.findElement(By.id("frameId"))); 
//do your stuff 
driver.switchTo().defaultContent(); 

hy vọng rằng sẽ giúp

+0

Tôi đồng ý với câu trả lời này. Trong phần "// làm công cụ của bạn", tôi sẽ sử dụng JavaScriptExectutor nếu DOM được trả về xảy ra có vẻ là rỗng. Hỏi: Tại sao phương thức gọi ".frame" khi tên thẻ thực tế là "iframe" ??? Không phải khung hình/bộ khung khác với iframe? – djangofan

+0

Xin chào, đây chỉ là phỏng đoán của tôi nhưng khung nội tuyến vẫn là một loại khung và đoạn mã này không phải là khung nội tuyến độc quyền vì vậy nó phải lo lắng với các khung khác (tôi không kiểm tra) – Tarken

+0

Nếu bạn lưu url bằng 'driver. getCurrentUrl(). sau đó (hàm (dữ liệu) { \t console.log ("url là:" + data); }); 'bạn sẽ thấy đó là một con đường khác mà không có một số tính năng. Bạn về cơ bản đã để lại tất cả các kịch bản của bạn. Tôi vẫn đang cố gắng tìm ra điều này. – Shane

1

Để quay trở lại khung chính, sử dụng:

driver.switchTo().parentFrame(); 

Để quay trở lại frame đầu tiên/main, sử dụng:

driver.switchTo().defaultContent(); 
17

Bạn cần phải đầu tiên tìm iframe. Bạn có thể làm như vậy bằng cách sử dụng câu lệnh sau.

WebElement iFrame= driver.findElement(By.tagName("iframe")); 

Sau đó, bạn có thể chuyển sang phương thức switchTo trên đối tượng WebDriver.

driver.switchTo().frame(iFrame); 

Và để di chuyển trở lại vào khung phụ huynh, bạn có thể sử dụng switchTo().parentFrame() hoặc nếu bạn muốn để có được trở lại khung chính (hoặc cha mẹ nhất), bạn có thể sử dụng switchTo().defaultContent();.

driver.switchTo().parentFrame(); // to move back to parent frame 
driver.switchTo().defaultContent(); // to move back to most parent or main frame 

Hy vọng điều đó sẽ hữu ích.

2
WebDriver driver=new FirefoxDriver(); 
driver.get("http://www.java-examples.com/java-string-examples"); 
Thread.sleep(3000); 
//Switch to nested frame 
driver.switchTo().frame("aswift_2").switchTo().frame("google_ads_frame3"); 
1

Dưới phương pháp xử lý khung: Khi không có id hoặc tên được đưa ra trong trường hợp của khung lồng nhau

WebElement element =driver.findElement(By.xpath(".//*[@id='block-block19']//iframe")); 
driver.switchTo().frame(element); 
driver.findElement(By.xpath(".//[@id='carousel']/li/div/div[3]/a")).click(); 
0

Selenium Web điều khiển khung Xử lý

driver.switchTo().defaultContent(); [parentFrame, defaultContent, frame]

Frames :

// Based on index position: 
int frameIndex = 0; 
List<WebElement> listFrames = driver.findElements(By.tagName("iframe")); 
System.out.println("list frames "+listFrames.size()); 
driver.switchTo().frame(listFrames.get(frameIndex)); 

// XPath|CssPath Element: 
WebElement frameCSSPath = driver.findElement(By.cssSelector("iframe[title='Fill Quote']")); 
WebElement frameXPath = driver.findElement(By.xpath(".//iframe[1]")); 
WebElement frameTag = driver.findElement(By.tagName("iframe")); 

driver.switchTo().frame(frameCSSPath); // frameXPath, frameTag 


driver.switchTo().frame("relative=up"); // focus to parent frame. 
driver.switchTo().defaultContent(); // move to the most parent or main frame 

// For alert's 
Alert alert = driver.switchTo().alert(); // Switch to alert pop-up 
alert.accept(); 
alert.dismiss(); 

XML kiểm tra:

<html> 
    <IFame id='1'>...  parentFrame() « context remains unchanged. <IFame1> 
    | 
    -> <IFrame id='2'>... parentFrame() « Change focus to the parent context. <IFame1> 

    <Fame id='11'>...  defaultContent() « driver focus to top window/first frame. <html> 
    | 
    -> <Frame id='22'>... defaultContent() « driver focus to top window/first frame. <Fame11> 
          frame("relative=up") « focus to parent frame. <Fame11> 

    ... 

Chuyển đổi RC để Web-Driver Java lệnh. link.

Các vấn đề liên quan