51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1656|回复: 2
打印 上一主题 下一主题

一个关于JavascriptExecutor执行特定javascript后无法switchto的问题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2014-9-25 10:25:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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对象了。

谁能知道其中原因。


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

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

回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-24 02:03 , Processed in 0.074637 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表