Java 使用selenium webdriver检查链接时处理异常
我试图通过检查页面上的H1元素来检查网页的所有菜单URL。因此,当循环运行并遇到异常时,循环停止。我希望循环继续,即使它遇到了css定位器的不匹配。请帮忙 这是我的代码Java 使用selenium webdriver检查链接时处理异常,java,selenium-webdriver,Java,Selenium Webdriver,我试图通过检查页面上的H1元素来检查网页的所有菜单URL。因此,当循环运行并遇到异常时,循环停止。我希望循环继续,即使它遇到了css定位器的不匹配。请帮忙 这是我的代码 List<WebElement> dropdown = Driver.findElementsByXPath("//ul[@class='nav']//ul//li//a"); int dropdown_count = dropdown.size(); System.o
List<WebElement> dropdown = Driver.findElementsByXPath("//ul[@class='nav']//ul//li//a");
int dropdown_count = dropdown.size();
System.out.println(dropdown_count);
for (int i=0; i<dropdown_count; i++)
{
String page = dropdown.get(i).getAttribute("href");
System.out.println(page);
Thread.sleep(2000);
Driver1.get(page);
try
{
Driver1.findElement(By.cssSelector("h1")).isDisplayed();
}
catch(NoSuchElementException ne)
{
System.out.println("error page: " + page);
}
{
System.out.println("page heading: " + Driver1.findElement(By.cssSelector("h1")).getText());
}
}
List dropdown=Driver.findElementsByXPath(“//ul[@class='nav']//ul//li//a”);
int dropdown_count=dropdown.size();
System.out.println(下拉计数);
对于(int i=0;iYou在这里有两个主要问题:
问题#1-未经处理的NoTouchElementException
代码中唯一可能导致这种情况的语句是Driver1.findElement(…)
您在try
子句内部执行此语句,但也在try
子句外部执行此语句
很明显,循环(可能还有整个方法)由于该异常而终止
因此,您需要将第二个Driver1.findElement(…)
移动到try
子句中
事实上,在try
子句中,您最好只搜索h1
元素一次:
try
{
WebElement h1 = Driver1.findElement(By.cssSelector("h1"));
if (h1.isDisplayed())
System.out.println("page heading: " + h1.getText());
}
catch(NoSuchElementException ne)
{
System.out.println("error page: " + page);
}
问题#2-未经处理的StaleElementException
此异常通常发生在获取某些WebElement
对象时,以及在稍后执行时-使用get(…)
导航到其他页面后,或使用switchTo().frame(…)
切换到其他帧后-尝试使用它时
这是在调用Driver1.get(page)
后尝试使用下拉列表时可能发生的情况
以下是此问题的可选解决方法:
for (int i=0; true; i++)
{
List<WebElement> dropdown = Driver.findElementsByXPath(...);
int dropdown_count = dropdown.size();
if (dropdown_count >= i)
break;
String page = dropdown.get(i).getAttribute("href");
Driver1.get(page);
...
Driver1.navigate().back();
}
for(int i=0;true;i++)
{
列表下拉列表=Driver.findElementsByXPath(…);
int dropdown_count=dropdown.size();
如果(下拉列表\u计数>=i)
打破
String page=dropdown.get(i).getAttribute(“href”);
Driver1.get(第页);
...
Driver1.navigate().back();
}
这是两个问题的替代解决方案,这将使您的程序更加高效。首先,迭代所有链接并构建URL列表。然后,导航到每个URL并在每个页面上执行您想执行的操作:
List<WebElement> links = Driver.findElementsByXPath(...);
List<String> pages = new ArrayList<String>();
for (WebElement dropdown : links)
{
String page = dropdown.getAttribute("href");
pages.add(page);
}
for (String page : pages)
{
Driver1.get(page);
try
{
WebElement h1 = Driver1.findElement(By.cssSelector("h1"));
if (h1.isDisplayed())
System.out.println("page heading: " + h1.getText());
}
catch(NoSuchElementException ne)
{
System.out.println("error page: " + page);
}
}
List links=Driver.findElementsByXPath(…);
列表页=新建ArrayList();
用于(WebElement下拉列表:链接)
{
String page=dropdown.getAttribute(“href”);
页面。添加(第页);
}
用于(字符串页:页)
{
Driver1.get(第页);
尝试
{
WebElement h1=Driver1.findElement(By.cssSelector(“h1”);
if(h1.isDisplayed())
System.out.println(“页面标题:+h1.getText());
}
捕获(无接触元素异常ne)
{
System.out.println(“错误页:“+页”);
}
}
我会把所有内容都放在try子句中,因为它可能会在很多行上失败。@welsh:我试过了。不起作用。你能发布你得到的异常吗?而且…在同一测试中,两个WebDriver背后有什么原因吗?除了导航到获取的url之外,sIt用于超越登录身份验证。这是异常:引起的by:org.openqa.selenium.remote.ErrorHandler$UnknownServerException:无法定位元素:{“方法”:“css选择器”,“选择器”:“h1”}链接将打开并检查H1。如果找到,则打印标题,否则打印错误页并继续循环。问题是,当未找到H1时,循环停止并抛出css选择器H1 not found的异常。我希望循环检查所有URL,并在控制台中不断给出异常nters不匹配。我不希望循环停止。请稍等!!!您正在循环中调用Driver1.get(page)
。这可能会使以前的WebElement
变得“过时”(一旦尝试使用它,就会导致StaleElementException
)。当您尝试在Driver1.get(page)
之后使用下拉列表时,可能会发生这种情况。我已经将它放在了try块中。当它遇到错误时,它仍然会停止!但是我需要它在循环中读取URL并逐个打开它们。请查看修改后的答案