在我的应用程序中打开页面时,会显示一个下拉列表,然后我需要单击“继续”按钮。问题是下拉需要一些时间来加载值,但在我的代码中,它在下拉加载之前单击。我尝试使用隐式wait和thread.sleep但它有时候它工作,有些时候不起作用。 代码:
public class Home {
public static void main(String[] args) throws IOException, InterruptedException
{
File file1 = new File("C:\\Selenium\\IEDriverServer_Win32_2.35.3\\IEDriverServer.exe");
System.setProperty("webdriver.ie.driver", file1.getAbsolutePath());
WebDriver driver = new InternetExplorerDriver();
driver.get("http://10.120.13.100/");
driver.manage().timeouts().implicitlyWait(50, TimeUnit.SECONDS);
Thread.sleep(3000);
WebElement clickBtn = driver.findElement(By.id("btnHomeProceed"));
clickBtn.click();
答案 0 :(得分:5)
您可以使用FluentWait
final Select droplist = new Select(driver.findElement(By.Id("selection")));
new FluentWait<WebDriver>(driver)
.withTimeout(60, TimeUnit.SECONDS)
.pollingEvery(10, TimeUnit.MILLISECONDS)
.until(new Predicate<WebDriver>() {
public boolean apply(WebDriver d) {
return (!droplist.getOptions().isEmpty());
}
});
答案 1 :(得分:1)
前一段时间我遇到了同样的问题。这是我使用Java 8的解决方案:
void selectTextFromDropDown(final By locator, final String value, final int timeoutInSeconds) {
FluentWait<WebDriver> wait = createWait(timeoutInSeconds);
wait.until(input -> {
Select mySelect = new Select(input.findElement(locator));
List<WebElement> options = mySelect.getOptions();
for (WebElement option : options) {
if (option.getText().equalsIgnoreCase(value)) {
option.click();
mySelect.getAllSelectedOptions().contains(value.toLowerCase());
break;
}
}
return true;
});
}
答案 2 :(得分:1)
使用正确的X.path进入选项可以很容易解决。尝试以下代码。
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//select[@name='Location']/option[@value='1']")));
这将查看option中的元素是否已加载,如果未加载,它将等待直到在给定的几秒钟内将其加载到DOM中。
答案 3 :(得分:0)
您应该使用wait()
和notify()
方法。
您编写Thread.sleep()
方法的地方,将其替换为this.wait()
。
您完成下拉列表的加载数据的地方放置了this.notify()
方法。
我希望这会对你有所帮助。
答案 4 :(得分:0)
这样的事情应该做你想做的事。
for (int second = 0;; second++) {
if (second >= 60) fail("timeout");
try {
Select droplist = new Select(driver.findElement(By.Id("selection")));
if(!droplist.getOptions().isEmpty()){
break;
}
} catch (Exception e) {
// best put something here
}
Thread.sleep(1000);
}
答案 5 :(得分:0)
您可以使用以下内容:
//To type text in drop down
driver.findElement(By.id("ur id")).sendKeys("txt");
//Use implicit wait to load the drop down
driver.manage().timeouts().implicitlyWait(250, TimeUnit.MILLISECONDS)
//Then click on the value in the drop down
new WebDriverWait(driver,30).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//li[@class='ui-menu-item'][5]"))).click()
//Now click the next drop down after clicking the drop down value
driver.findElement(By.className("buttonname")).click()