我需要使用Selenium WebDriver(Java API)单击动态生成的元素。 我正在等待这个元素出现在WebDriverWait然后点击它。此单击成功,但以下单击不同的静态元素会冻结整个测试。这是代码:
webDriver.get(alfrescoURL + "/share/page/create-document");
WebDriverWait wait = new WebDriverWait(webDriver, 10);
WebElement documentTypeList = webDriver.findElement(By.id("template_x002e_create-document_x002e_create-document_x0023_default_documenttype-selected-form-button-button"));
documentTypeList.click();
WebElement listItem = wait.until(
ExpectedConditions.visibilityOfElementLocated(By.id("yui-gen100")));
listItem.click();
// Choosing to create in new project
WebElement projectLink = webDriver.findElement(By.id("template_x002e_create-document_x002e_create-document_x0023_default_projecttype-entry1"));
projectLink.click();
documentTypeList.click()
打开一个下拉列表,listItem.click()
选择一个项目,projectLink.click()
在radiobuttons组中做出选择。在projectLink.click()
上静默测试冻结。看起来这个click()
无限期地等待由于某种原因发生的页面重新加载,而它不应该。 (选择项目后消失列表是由javascript制作的,不会发出任何AJAX请求。)
我认为有一些关于click()
阻止我不明白的事情。它在它的javadoc中说,只有当它导致页面加载时它才会尝试阻止。不过在这里我出于某种原因得到了阻止。
如果我在projectLink.click()
之前插入线程睡眠,那么测试工作正常。它同意一个假设,即我在click()
上得到一个无限块。
提前致谢。
答案 0 :(得分:0)
在测试运行速度快于下拉可以收缩并且无法单击以下元素之前,我遇到过此问题。而不是使用任意睡眠(尽管在极少数情况下它们是必要的),你能否等待下拉中的课程改变?
例如,如果我想在继续之前等待下拉合同,我将等待select的类从“active”更改为“closed”。当然,这假定您的HTML具有这些动态类。
另一种可能性是设置隐式等待,为这样的实例提供足够的填充:
driver.manage().timeouts().implicitlyWait(1000, TimeUnit.MILLISECONDS);
答案 1 :(得分:0)
我建议您也尝试其他点击选项:
Actions#click()
如果这些单击中的任何一个有效,则表明问题在于硒的WebElement Click方法,需要报告该问题。