selenuim-phantomjs-java无法获取动态加载的元素

原文链接

iframe是js动态加载的,获取的页面没有iframe元素…

问题现象

  1. 无法获取页面元素<最直观现象>
  2. iframe是js动态加载的,获取的页面没有iframe元素
  3. 富文本编辑框拿不到
  4. driver.findElement(By.id(“iframe_id”)) 抛出异常,无法找到元素
  5. driver.switchTo().frame(driver.findElement(By.id(“iframe_id”))); 这个就更不用想了,连iframe_id都拿不到switch毛啊。

明明从chrome浏览器检查元素的时候可以看到iframe元素,
但是查看源代码的时候iframe就没有了…
握草
通过查一些资料发现:

所谓源码,就是别人服务器发送到浏览器的原封不动的代码。
你那些在源码中找不到的代码,那是在浏览器执行js动态生成的。

好!既然知道了问题所在,那我们就…
搜一下有没有现成的解决方案:

“jQuery如何获取动态添加的元素”
“js如何获取动态添加的元素”

都说要用jQuery on 函数,然后…
就走了大量的弯路,根本不好用好么!!!
不好用!!!
不好用!!!
不好用!!!
我已经用了洪荒之力了
说实话,我有点方了…


解决方案

走投无路之下,我只能死马当活马医:
直接给最底层元素赋值:

$("#textarea_id").val("hello world");

哇,没想到成了,对你没有看错,成了!!!!
叉会腰



完成代码

平生最恨贴代码不贴jar包的人!!!

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriverService;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
.........
......
..

public static void setTextarea(WebDriver driver,String target){
        String url = "https://bukemiaoshudeurl.com/"+target;
        driver.get(url);
        Thread.sleep(5000);
        JavascriptExecutor jse = (JavascriptExecutor) driver ;
        String script = "$(\"#textarea_id\").val(\"hello world\");\r\n" +
                "$(\"#textarea_submit\").trigger(\"click\"); ";
        jse.executeScript(script);
    }

maven 的pom.xml

<dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>2.53.0</version>
    </dependency>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-remote-driver</artifactId>
        <version>2.53.0</version>
    </dependency>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-server</artifactId>
        <version>2.53.0</version>
    </dependency>

    <dependency>
        <groupId>com.codeborne</groupId>
        <artifactId>phantomjsdriver</artifactId>
        <version>1.2.1</version>
        <exclusions>
            <exclusion>
                <groupId>org.seleniumhq.selenium</groupId>
                <artifactId>selenium-remote-driver</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.seleniumhq.selenium</groupId>
                <artifactId>selenium-java</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

兄弟只能帮你到这了,遇到问题不要慌,就是怼!



后续的坑

如果观察仔细的小伙伴可能会发现,我通过js提交了表单,页面直接重定向到主页了
但是,现在直接获取url或者源码发现还是原来的提交页面???
黑人问号

public static void setTextarea(WebDriver driver,String target){
        String url = "https://bukemiaoshudeurl.com/"+target;
        driver.get(url);
        Thread.sleep(5000);
        JavascriptExecutor jse = (JavascriptExecutor) driver ;
        String script = "$(\"#textarea_id\").val(\"hello world\");\r\n" +
                "$(\"#textarea_submit\").trigger(\"click\"); ";
        jse.executeScript(script);
      System.out.println(driver.getCurrentUrl());
      System.out.println(driver.getPageSource());
    }

试了很多办法,我没办法用当前页面的js获取到未来要跳转页面的内容啊.(懵逼脸)

经过一番努力…

只需要在执行完js后等待几秒就好了,对!是什么都不用做,等待页面加载完就可以了
感觉自己是在跟空气斗智斗勇…
吐血

public static void setTextarea(WebDriver driver,String target){
        String url = "https://bukemiaoshudeurl.com/"+target;
        driver.get(url);
        Thread.sleep(5000);
        JavascriptExecutor jse = (JavascriptExecutor) driver ;
        String script = "$(\"#textarea_id\").val(\"hello world\");\r\n" +
                "$(\"#textarea_submit\").trigger(\"click\"); ";
        jse.executeScript(script);
      Thread.sleep(10000);
      System.out.println(driver.getCurrentUrl());
      System.out.println(driver.getPageSource());
    }



微信公众号

wechat

猜你喜欢

转载自blog.csdn.net/r_eynolds/article/details/81237794