今天堡垒给我提了做自动化的需求.就开始自动化起来.
开始的时候,觉得用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/
源文档 <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
发现是元素隐藏太深,我没法定位到。
给大家看下元素:
整个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);
后面就顺利很多了,这个东西,困惑了我两天。
现在的感想是,需要多实践,实践才知道有这么多的坑。
网上的资料真的好不全。自己要多积累。