51Testing软件测试论坛

标题: 一个关于JavascriptExecutor执行特定javascript后无法switchto的问题 [打印本页]

作者: aperson    时间: 2014-9-25 10:25
标题: 一个关于JavascriptExecutor执行特定javascript后无法switchto的问题
本帖最后由 aperson 于 2014-9-25 10:31 编辑

以下是iframe.htm的源码:
  1. <html>
  2.         <head>
  3.                 <title>iFrame Test</title>
  4.         </head>
  5.         <body>
  6.                 <div style="height: 300px;width: 400px;">
  7.                         <input type="text" name="txt" />
  8.                         <p>
  9.                         <iframe frameborder="yes" width="100%" style="height:100%;display: block;">
  10.                                 <html>
  11.                                         <body>
  12.                                                 <br>
  13.                                         </body>
  14.                                 </html>
  15.                         </iframe>
  16.                         <p>
  17.                         <input type="button" name="sbmt" value="SUBMIT" onclick="javascript:document.getElementsByName('txt')[0].value='You are welcome!'" />
  18.                 </div>
  19.         </body>
  20. </html>
复制代码
以下是WebDriver的java版源码:
  1. import java.util.concurrent.TimeUnit;
  2. import org.openqa.selenium.By;
  3. import org.openqa.selenium.JavascriptExecutor;
  4. import org.openqa.selenium.WebDriver;
  5. import org.openqa.selenium.firefox.FirefoxDriver;
  6. public class Test1 {
  7.         public static void main(String[] args) {
  8.                 // TODO Auto-generated method stub
  9.                 WebDriver driver = new FirefoxDriver();
  10.                 driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
  11.                 driver.manage().window().maximize();
  12.                 driver.navigate().to("http://localhost/webtest/iframe.htm");
  13.                 driver.findElement(By.name("txt")).sendKeys("hello");
  14.                 driver.switchTo().frame(driver.findElement(By.tagName("iframe")));
  15.                 JavascriptExecutor js = (JavascriptExecutor)driver;
  16.                 js.executeScript("document.write('hello everybody!')", driver.findElement(By.tagName("body")));
  17.                 js.executeScript("arguments[0].innerHTML = 'hello everybody!'", driver.findElement(By.tagName("body")));
  18.                 driver.switchTo().defaultContent();
  19.                 driver.findElement(By.name("sbmt")).click();
  20.                 try {
  21.                         Thread.sleep(3000);
  22.                 } catch (InterruptedException e) {}
  23.                 driver.quit();
  24.         }
  25. }
复制代码
只执行document.write就会导致无法switchTo.defaultContent,而且这时候即使输出driver.getWindowHandle都是失败的,而只执行arguments[0].innerHTML就没有问题。

貌似一旦执行document.write后,selenium core中的js就丢掉原来的document对象了。

谁能知道其中原因。



作者: 泰然    时间: 2014-11-26 09:18
整个page被更新后,selenium ide就无法再获取到原来的document对象,导致了整个selenium的失效,所以JavascriptExecutor对象是不能对整个页面进行document.write的,在这点上JavascriptExecutor的安全机制做得不够。


作者: aperson    时间: 2015-2-2 13:09
哦。学习了。




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2