我是Selenium / webdriver的新手。我写了一个运行多次迭代的测试用例。在第一个上面会出现一个弹出窗口。但是,在后续迭代中,弹出窗口不存在。如何重新编写此代码以便在继续执行下面的代码之前检查弹出窗口?感谢
String Parentwindow = oWD.getWindowHandle();
//Click Search button -- This will cause the pop-up
oWD.findElement(By.id("uw_fc_sub_anc")).click();
Thread.sleep(1000);
for(String ChildWindow : oWD.getWindowHandles())
{
oWD.switchTo().window(ChildWindow);
}
oWD.close();
oWD.switchTo().window(Parentwindow);
答案 0 :(得分:1)
我可能会将其分解为辅助方法,该方法执行如下操作:
public String clickAndFindPopup(WebDriver driver, By locator) {
// Get the original list of handles to evaluate if a popup
// needs to be handled.
List<String> existingHandles = driver.getWindowHandles();
//Click Search button -- This will cause the pop-up
driver.findElement(locator).click();
Thread.sleep(1000);
List<String> windowHandles = driver.getWindowHandles();
windowHandles.removeAll(existingHandles);
if (windowHandles.size() > 0) {
return windowHandles.get(0);
}
return "";
}
然后你可以这样做:
String popupHandle = clickAndFindPopup(driver, By.id("uw_fc_sub_anc"));
if (!popupHandle.equals("")) {
String currentHandle = driver.getWindowHandle();
driver.switchTo().window(popupHandle);
driver.close();
driver.switchTo().window(currentHandle);
}
这里的缺点是,如果你真的只想到第一次迭代的弹出窗口,你可能会忽略一个不应该出现的弹出窗口,因为只要找到弹出窗口就会盲目关闭弹出窗口。一个更好的方法是知道您希望浏览器在自动化状态时所处的状态,并在其上声明。
答案 1 :(得分:0)
我使用try catch来处理“可能的通知”。我捕获了由非现有元素生成的两个可能的异常。这是C#BTW:
public void ClosePossibleRandomNotification()
{
bool exists=false;
try
{
Browser.Driver.FindElement(By.XPath("..."));
exists = true;
}
catch (ElementNotVisibleException)
{
exists = false;
}
catch (NoSuchElementException)
{
exists = false;
}
if (exists){
try
{
//close the pop up
}
catch (ElementNotVisibleException)
{
exists = false;
}
}
}
答案 2 :(得分:0)
尝试创建一个布尔函数并使用try catch来处理弹出窗口