Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用selenium webdriver检查链接时处理异常_Java_Selenium Webdriver - Fatal编程技术网

Java 使用selenium webdriver检查链接时处理异常

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

我试图通过检查页面上的H1元素来检查网页的所有菜单URL。因此,当循环运行并遇到异常时,循环停止。我希望循环继续,即使它遇到了css定位器的不匹配。请帮忙

这是我的代码

    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并逐个打开它们。请查看修改后的答案