我正在尝试点击下拉列表中的所有链接。某些链接将打开一个新的浏览器窗口,其中某些链接将加载到同一页面中。
所以,我想只在新窗口打开时切换到新窗口,还需要确认新页面是否正确加载。 我已经有代码切换窗口。但即使没有打开新窗口,它也试图切换新窗口。
有人可以帮助我。
以下是相关的HTML:
<html>
<div class="column span-8">
<div class="search-container align-center">
<div class="search">
<div class="search-dropdown" onclick="showHideUtilMenu(event, 'SearchMenu');">
<span id="searchoptionValue">Consumer</span>
<span id="dropdownarrow"</span>
<span id="searchurlValue" style="display: none;">http://</span>
<div id="SearchMenu" class="utility-menu combobox visible">
<ul class="menu-list">
<li class="menu-link">
<li class="menu-link divider">
<a onclick="getSearchOption('Consumer','http://');">Consumer</a>
...
这是我到目前为止使用的代码:
List<WebElement> list = driver.findElements(By.xpath("//*[@class='search-dropdown']/div[1]/ul/li"));
for (WebElement option : list)
{
String strLabel = option.getText();
if(strlabel.equalsIgnoreCase(value1) && country.equals("US"))
{
option.findElement(By.linkText(strLabel)).click();
CommonFunctions.waitForPageLoad();
CommonFunctions.switchWindow();
}
}
答案 0 :(得分:0)
我希望您需要类似下面的方法
class CommonFunctions {
/**
* It will wait for an element until it loads completely
*/
public static void waitForPageToLoad() {
int i=0;
while(isElementPresent(By.id("<specifySomeLocator>")))
{
Thread.sleep(100);
if(++i>500)
{
break;
}
}
}
/**
* It will Switch the control to new window if exist.
*/
public static boolean switchToWindow(String mainWindowHandle) {
Set<String> windowhandles=driver.getWindowhandles();
if(windowhandles.size()>1) {
windowhandles.remove(mainWindowHandle);
driver.switchTo().window((String)windowhandles.toArray()[0]);
return true;
} else {
return false;
}
}
}
您尝试实现类似下面的代码
List<WebElement> list = driver.findElements(By.xpath("//*[@class='search-dropdown']/div[1]/ul/li"));
for (int i=0;i<list.size();i++)
{
String strLabel = driver.findElements(By.xpath("//*[@class='search-dropdown']/div[1]/ul/li")).get(i).getText();
if(strlabel.equalsIgnoreCase(value1) && country.equals("US"))
{
String mainWindowHandle=driver.getWindowHandle();
option.findElement(By.linkText(strLabel)).click();
CommonFunctions.waitForPageToLoad();
if(CommonFunctions.switchToWindow(mainWindowHandle)){
//do your operation in new window
//close new window using ==> driver.close();
//switch back to main window ==> driver.switchTo().window(mainWindowHandle);
} else {
//do your operations in main window itself
}
}
}
仅供参考:如果您迭代下面的WebElements列表,如果在使用第一个元素执行其他操作时页面重新加载,则会尝试访问该列表中的第二个元素时抛出StaleElementReferenceException。
for (WebElement option : list)
{
String strLabel = option.getText();
//do some operations
}
对于isElementPresent方法实施,请点击here
答案 1 :(得分:0)
这是一般性建议,而非直接回答您的问题。
您可以使用以下任一选项从当前网页导航到另一个网页:
driver.get(...);
driver.navigate().to(...);
driver.switchTo().frame(...);
driver.switchTo().window(...);
但是,一旦这样做,您从上一个网页的DOM获得的任何元素都可能变得“陈旧”。
为了避免这种情况,建议您首先获取要转到的所有网址(字符串),然后再导航到 中的每一个
。以您问题中的代码为例,您可以按如下方式进行更改:
List<String> strLabels = new ArrayList<String>();
List<WebElement> list = driver.findElements(By.xpath("//*[@class='search-dropdown']/div[1]/ul/li"));
for (WebElement option : list)
{
String strLabel = option.getText();
if (strlabel.equalsIgnoreCase(value1) && country.equals("US"))
strLabels.add(strLabel);
}
for (String strLabel : strLabels)
{
driver.findElement(By.linkText(strLabel)).click();
CommonFunctions.waitForPageLoad();
CommonFunctions.switchWindow();
}