如何使用phantomjs和selenium解决java中的UmbrellaException错误

时间:2018-04-24 17:00:59

标签: java selenium selenium-webdriver gwt phantomjs

我想使用selenium和phantom来自动测试登录页面这是我的代码,它可以与firefox一起使用,但我需要使用phantomJs

try {
        DesiredCapabilities caps = new DesiredCapabilities();
        caps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY, "D:\\phantomjs_2_1_1\\bin\\phantomjs.exe");
        caps.setCapability(PhantomJSDriverService.PHANTOMJS_PAGE_SETTINGS_PREFIX,"Y");
        caps.setCapability("phantomjs.page.settings.userAgent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:16.0) Gecko/20121026 Firefox/16.0");
        caps.setJavascriptEnabled(true);
        caps.setCapability("takesScreenshot", true);

        PhantomJSDriver driver = new PhantomJSDriver(caps);

        driver.get("mypage-login");

        TimeUnit.SECONDS.sleep(3);

        File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);


        FileUtils.copyFile(scrFile, new File("d:\\sample.png"),true);

        System.out.println("FIND ELEMENT [OK] ");


        new WebDriverWait(driver, 120).until(
                ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id=\"elemId17\"]"))).click();

        scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);

        System.out.println("scrFile := " + scrFile.getAbsolutePath());
        FileUtils.copyFile(scrFile, new File("d:\\sample2.png"),true);

        TimeUnit.SECONDS.sleep(2);

        driver.findElement(By.xpath("//*[@id=\"x-auto-1-input\"]")).sendKeys("username");
        driver.findElement(By.xpath("//*[@id=\"x-auto-5-input\"]")).sendKeys("domain");
        driver.findElement(By.xpath("//*[@id=\"x-auto-4-input\"]")).sendKeys("password");

        new WebDriverWait(driver, 120).until(
                ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id=\"elemId98\"]"))).click();

        scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
        FileUtils.copyFile(scrFile, new File("d:\\sample3.png"),true);

        if (driver.findElement(By.id("elemId98")) == null)
            System.out.println("OK");
        System.out.println("KO");


    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }catch (NullPointerException e) {
        e.printStackTrace();
    }
    finally {
        System.out.println("life is good !");
    }

得到的错误是:

ERROR - 2018-04-24T16:23:41.092Z] Session [cb29bc00-47db-11e8-9aae-df14adbccf9e] - page.onError - msg: Error: com.google.gwt.event.shared.UmbrellaException: Exception caught: (TypeError) : null is not an object (evaluating 'result[1]')
phantomjs://platform/console++.js:263 in error
[ERROR - 2018-04-24T16:23:41.092Z] Session [cb29bc00-47db-11e8-9aae-df14adbccf9e] - page.onError - stack: vkb (mypage:326)
 dispatchEvent (:0)
U (:119) $ (:108)
$ (:101)
gh (:141)
sh (:152)
(anonymous function) (:152)
(anonymous function) (:152)
(anonymous function) (:153)
phantomjs://platform/console++.js:263 in error

在截图中,我可以看到一些不合适的东西;在最后一次测试(下面这段代码)之后,我在睡眠10秒后添加一个新的TakesScreenshot,结果与之前的截屏号3' simple3'相同。它似乎在此阶段被阻止(单击登录按钮并显示加载索引或错误页面的动画)

 if (driver.findElement(By.id("elemId98")) == null)
            System.out.println("OK");
        System.out.println("KO");

我正在倾听并提前感谢您的任何其他信息:)

1 个答案:

答案 0 :(得分:0)

UmbrellaException

UmbrellaException是{strong> com.google.web.bindery.event.shared 程序包中gwtproject定义的Java RuntimeException ,用于收集集合孩子一起扔草。此异常通常在循环之后抛出,在该循环期间抛出所有异常,但是延迟以便循环完成执行。

详细的错误堆栈跟踪可以帮助我们更好地研究问题。但按照以下讨论:

com.google.gwt.event.shared.UmbrellaException 的根本原因似乎是 java.lang.NullPointerException

问题和解决方案

您需要按照以下方式处理代码中的某些内容:

  • 当您尝试调用(By.xpath("//*[@id=\"elemId98\"]"))而不是 ExpectedConditions 方法click()时,如果返回标识为presenceOfElementLocated()的元素,则必须使用{{ 3}}如下:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@id='elemId98']"))).click();
    

    在等待任何元素可点击时,这应该是练习的一部分。

  • 如果在 WebDriverWait 之后返回标识为(By.xpath("//*[@id=\"elemId98\"]"))的elelemt,并且在下一步click()之后调用findElement()将无法执行再次找到上一个元素,如:

    if (driver.findElement(By.id("elemId98")) == null)
    

    此处可能会提出elementToBeClickable()NoSuchElementException

  • 接下来,您尝试将driver.findElement(By.id("elemId98"))的结果与 null 进行比较,这不符合最佳做法。根据{{​​3}}的文档,明确提到:

  

StaleElementReferenceException不应该用于查找不存在的元素,请使用findElement()并断言零长度响应。

结论

所有这些问题/错误都发生在**try-catch {}**块中,它会综合地抛出 com.google.gwt.event.shared.UmbrellaException 。遵守上述步骤将解决问题。