假设我想要模拟一个场景,用户希望在两次点击之间(最多2-3秒)逐个查看所有可折叠内容,如Accordion窗口小部件,等待一段时间
用户点击第1部分,然后等待2秒,然后点击第2部分,依此类推。
我想过以这种方式实施
package com.rahul.misc;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;
public class accordion {
public WebDriver driver;
private String baseUrl;
public static void main(String[] args) {
accordion acc=new accordion();
acc.checkFirefox();
// TODO Auto-generated method stub
}
public void checkFirefox(){
driver=new FirefoxDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
baseUrl="http://jqueryui.com/accordion/";
driver.get(baseUrl);
List<WebElement> allinks= driver.findElements(By.cssSelector(".ui-accordion-header"));
for(WebElement w:allinks){
new Actions(driver).click().build().perform();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} }
此代码正确编译但不执行任何操作。我对将所有元素列入列表的部分持怀疑态度。这是捕获窗口小部件的所有Web元素的正确方法。如果没有,我该怎么做。
行动也是正确的吗?因为在该场景中,用户不会进入,他只是单击可折叠标题。
答案 0 :(得分:3)
您的代码没有做任何事情的原因是因为元素包含在iframe
中。如果没有找到任何元素,findElements()
不会抛出异常,因此您的代码将运行完成。
您可以像这样修复该部分:
baseUrl="http://jqueryui.com/accordion/";
driver.get(baseUrl);
driver.switchTo().frame(driver.findElement(By.cssSelector(".demo-frame")));
在iframe
完成后,您需要像这样切换回来:
driver.switchTo().defaultContent();
我相信你会在这一行遇到另一个问题:
new Actions(driver).click().build().perform();
click()
上下文中的 Actions
点击鼠标当前所在的位置。当你没有告诉鼠标指向哪里时,它会在某个地方点击,但不会在你想要的元素上点击。您可以通过几种不同的方式解决这个问题。
我建议这样做:
w.click();
如果你想留在Actions
链,你可以这样解决:
new Actions(driver).click(w).build().perform();