aperson 发表于 2014-9-25 10:25:49

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

本帖最后由 aperson 于 2014-9-25 10:31 编辑

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

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

谁能知道其中原因。


泰然 发表于 2014-11-26 09:18:57

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

aperson 发表于 2015-2-2 13:09:59

哦。学习了。
页: [1]
查看完整版本: 一个关于JavascriptExecutor执行特定javascript后无法switchto的问题