Selenium2中元素hidden和iframe处理

  • 今天堡垒给我提了做自动化的需求.就开始自动化起来.

    开始的时候,觉得用RFS比较简单,因为业务逻辑也不是很复杂。

    开始的时候遇到一个问题,就是下拉框总是点不着。

     RFS中有那个语句,就是wait 某个元素出现。不出现不做下一步。

    总算解决了那个问题。

    然后写了几个,还是很顺利的。我把关键字跟事物分层。

    接着遇到麻烦了,就是在输入正文的时候,总是说元素hidden.

    然后弄了很多办法,也没法成功。

    当时很困惑,去群里面发帖,也没人帮解决,这个只得自己硬着头皮上了。

    后面去问lily,他说是不是在iframe下面。我去看了一下,果然。

    但是在RFS总是执行Javascript语句不成功,终于发现不太好用了。

    Lily 告诉我以前我们的经验,就是把那个认为是true的。

    语句如下:((JavascriptExecutor)driver).executeScript("arguments[0].checked = true;", content);//其中content是元素

    然后robot里面也有切换元素的语句。但是就是没有执行成功。

    后面在网上找答案,有答案说,可以装Selenium2Library带frame的包。

    结果悲剧了,装好后,用不了了,那包是很老。我又要去装RFS的环境了。

     

    没有办法,只有用java来搭建框架,这个语法灵活,对javascript也很好支持。

    结果又遇到hidden的问题,就是有元素是下来框的,后一个元素需要前面的点开,才能点到。

    比如论坛的那个,我用click不行,后面想到用hover.

    找到了一个解决方案:

    http://www.anitpatel.net/2012/02/25/selenium-webdriver-how-to-click-on-a-hidden-link-or-menu/

    1. js.ExecuteScript("return $(\"a:contains('Fruits')\").mouseover();"); // Mouse hove to main menu  
    2. webDriver.FindElement(By.LinkText("Banana")).Click(); 

     

    源文档 <http://www.anitpatel.net/2012/02/25/selenium-webdriver-how-to-click-on-a-hidden-link-or-menu/>

    这个方案有点启发,但是不行。

    后面又找到了个,现在找不到那个链接了,当时真应该保存下来。

     

    然后我封装了个类:

     

        public static void hoverandclick(WebElement path, WebDriver driver)

        {

                Actions builder = new Actions(driver);

                Actions hoverOverRegistrar = builder.moveToElement(path);

                hoverOverRegistrar.perform();

        }

        然后调用就可以了,

       public void clickluntan() {

       //         luntan.click();

                WebDriverWrapper.hoverandclick(luntan, driver);

                System.out.println("点中了");

                xiaoyuanhuodong.click();

            WebDriverWrapper.waitPageLoad(driver, 2);

     

       }

    但是后面一个发帖->发新贴,就不能依葫芦画瓢,因为下拉框少,时间不够,总是点不到。

    后面找到了个链接,说是不需要点开也能访问hidden的元素。

        public XiaoyuanactivityPage clickfaxintie() {

                

                WebDriverWrapper.hoverandclick(faxintie, driver);

    //            ((JavascriptExecutor)driver).executeScript("arguments[0].checked = true;", content);

     //           ((JavascriptExecutor)driver).executeScript("return arguments[0].innerHTML", faxintie);

                ((JavascriptExecutor)driver).executeScript("document.getElementsByClassName('it_bk')[0].click();");

      //          xintie.click();

                System.out.println("点中了ss");

            WebDriverWrapper.waitPageLoad(driver, 3);

            return PageFactory.initElements(this.getDriver(),

                            XiaoyuanactivityPage.class);

        }

    然后总算,这个坎也绕过去了。

     

    接着解决那个iframe的问题了。

    看了这篇文章,http://blog.csdn.net/anniejunyan/article/details/23257327

    有点点启发,实践了以下代码:

    ((JavascriptExecutor)driver).executeScript("arguments[0].checked = true;", content);

                driver.switchTo().frame(driver.findElement(By.id("baidu_editor_0")));

                System.out.println("点中了title3");

                driver.findElement(By.xpath("/html/body")).sendKeys("周末打羽毛球的赶紧报名,名额有限,欲去请快!");

                //do your stuff

     //           content.clear();

     //           System.out.println("点中了title2");

    //            ((JavascriptExecutor)driver).executeScript("dom=(document.getElementById(\"baidu_editor_0\").firstChild.contentWindow).document.body", "aaaaaaaa");

    //            content.sendKeys("周末打羽毛球的赶紧报名,名额有限,欲去请快!");

                driver.switchTo().defaultContent();

     //           System.out.println("点中了title4");

      //          jQuery('iframe').contents().find('ul li a:eq(0)').click();

     //           content.clear();

     //           System.out.println("点中了title2");

      //          content.sendKeys("周末打羽毛球的赶紧报名,名额有限,欲去请快!");

      //          System.out.println("点中了title5");

     //           driver.switchTo("baidu_editor_0");

       //     @selenium.type "dom=(document.getElementById(\"SinaEditor_Iframe\").firstChild.contentWindow).document.body", "aaaaaaaa"

                

    这是实践过的代码。折腾啊,总是找不到元素。

    晚上回去的时候,发现了这篇文章http://blog.csdn.net/passionboyxie/article/details/25839137

    发现是元素隐藏太深,我没法定位到。

    给大家看下元素:

    <div id="edui1_iframeholder" class="edui-editor-iframeholder" style="overflow: hidden; height: 361px;">
    <iframe id="baidu_editor_0" width="100%" height="100%" frameborder="0">
    <!DOCTYPE html>
    <html class="view" xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <body contenteditable="true" spellcheck="false" style="">
    </html>
    </iframe>
    </div>


    整个body中就一个语句。

    后面想找开发,帮忙看看,开发还没找到。结果自己再试下往body,里面传数,结果成功了。

    后面又封装了个类。万事大吉!!!

        public static void Contents(WebElement path, String frampath, String fbodypath, String neirong, WebDriver driver)

        {

                ((JavascriptExecutor)driver).executeScript("arguments[0].checked = true;", path);

                driver.switchTo().frame(driver.findElement(By.id(frampath)));

                driver.findElement(By.xpath(fbodypath)).clear();

                driver.findElement(By.xpath(fbodypath)).sendKeys(neirong);

                driver.switchTo().defaultContent();

        }

     

     

    调用:

                WebDriverWrapper.Contents(content, "baidu_editor_0", "/html/body", neirong , driver);

     

    后面就顺利很多了,这个东西,困惑了我两天。

    现在的感想是,需要多实践,实践才知道有这么多的坑。

    网上的资料真的好不全。自己要多积累。

     

     

     

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值