简体   繁体   English

如何使用 Java 使用 Selenium WebDriver 捕获 JavaScript 错误

[英]How to capture JavaScript errors with Selenium WebDriver using Java

我想知道是否有办法在运行自动化 Selenium 测试时捕获页面上的 JavaScript 错误。

There is logs Beta version in WebDriver WebDriver日志Beta 版

driver.manage().logs().get(LogType.BROWSER);

Will give you the console content.会给你控制台内容。

Then you can filter it using Level然后你可以使用Level过滤它

LogEntries entries = driver.manage().logs().get(LogType.BROWSER);
entries.filter(Level.SEVERE);

And there is one that worked for me.有一个对我有用。 Here it is.这里是。

    public boolean isThereJSErrorOnThePage() {
    Set<String> errorStrings = new HashSet<>();
    errorStrings.add("SyntaxError");
    errorStrings.add("EvalError");
    errorStrings.add("ReferenceError");
    errorStrings.add("RangeError");
    errorStrings.add("TypeError");
    errorStrings.add("URIError");
    LogEntries logEntries = driver.manage().logs().get(LogType.BROWSER);
    for (LogEntry logEntry : logEntries) {
        for (String errorString : errorStrings) {
            if (logEntry.getMessage().contains(errorString)) {
                LOGGER.error("Java Script error has been detected:");
                LOGGER.error(new Date(logEntry.getTimestamp()) + " " + logEntry.getLevel() + " " + logEntry.getMessage());
                return true;
            }
        }
    }
    return false;
}

If it does not work out of a box, try to add capabilities:如果开箱即用,请尝试添加功能:

DesiredCapabilities desiredCapabilities = DesiredCapabilities.chrome();
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.BROWSER, Level.ALL);
desiredCapabilities.setCapability(CapabilityType.LOGGING_PREFS, logPrefs);
driver = new ChromeDriver(desiredCapabilities);

您可以尝试https://github.com/AutomatedOwl/chromedriver-js-errors-collector它捕获所有 js 错误并将它们附加到诱惑报告

Try the below code for capturing the javascript error of webPage and let me know if it has helped you尝试使用以下代码来捕获 webPage 的 javascript 错误,如果它对您有帮助,请告诉我

import java.util.List;
import java.util.concurrent.TimeUnit;
import net.jsourcerer.webdriver.jserrorcollector.JavaScriptError;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

public class jsError {
 WebDriver driver;

 @BeforeTest
 public void setup() throws Exception {
  FirefoxProfile profile = new FirefoxProfile();
  JavaScriptError.addExtension(profile);
  driver = new FirefoxDriver(profile);
  driver.manage().window().maximize();
  driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
  driver.get("http://only-testing-blog.blogspot.com/2015/01/table-with-checkbox.html");
 }

 @Test
 public void printPageErrors() throws Exception {
  //Capture all errors and store them In array.
  List<JavaScriptError> Errors = JavaScriptError.readErrors(driver);
  System.out.println("Total No Of JavaScript Errors : " + Errors.size());
  //Print Javascript Errors one by one from array.
  for (int i = 0; i < Errors.size(); i++) {
   System.out.println("Error Message : "
     + Errors.get(i).getErrorMessage());
   System.out.println("Error Line No : "
     + Errors.get(i).getLineNumber());
   System.out.println(Errors.get(i).getSourceName());
   System.out.println();
  }
 }
}
import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.logging.LogEntries;
import org.openqa.selenium.logging.LogEntry;
import org.openqa.selenium.logging.LogType;
import org.openqa.selenium.logging.LoggingPreferences;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.testng.asserts.SoftAssert;

import java.util.Date;
import java.util.logging.Level;

public class LoginTest {

    private WebDriver driver;

    @BeforeMethod
    public void setPreConditions() {
        WebDriverManager.chromedriver().setup();
        DesiredCapabilities capabilities = DesiredCapabilities.chrome();
        LoggingPreferences loggingPreferences = new LoggingPreferences();
        loggingPreferences.enable(LogType.BROWSER, Level.ALL);
        capabilities.setCapability(CapabilityType.LOGGING_PREFS, loggingPreferences);
        driver = new ChromeDriver(capabilities);

        driver.manage().window().maximize();
        driver.get("your_web_application_url");

        // Put a wait condition if needed.
    }

    @Test
    public void checkJavaScriptErrors() {
        checkJavaScriptErrorsAreNotAvailable(Level.SEVERE);
    }

    @AfterMethod
    public void quit() {
        driver.quit();
    }

    private void printJavaScriptErrors() {
        LogEntries logEntries = driver.manage().logs().get(LogType.BROWSER);
        for (LogEntry entry : logEntries) {
            System.out.println(new Date(entry.getTimestamp()) + " " + entry.getLevel() + " " + entry.getMessage());
        }
    }

    private void checkJavaScriptErrorsAreNotAvailable(Level level) {
        LogEntries logEntries = driver.manage().logs().get(LogType.BROWSER);
        SoftAssert softAssert = new SoftAssert();
        for (LogEntry entry : logEntries) {
            if (entry.getLevel().equals(level)) {
                softAssert.fail(new Date(entry.getTimestamp()) + " " + entry.getLevel() + " " + entry.getMessage());
            }
        }
        softAssert.assertAll();
    }
}

If you only need to print the JavaScript errors, you can use the method printJavaScriptErrors()如果您只需要打印 JavaScript 错误,则可以使用方法printJavaScriptErrors()

If you need to fail the test when there are JavaScript errors, you can use checkJavaScriptErrorsAreNotAvailable(Level level) .如果在出现 JavaScript 错误时需要使测试失败,可以使用checkJavaScriptErrorsAreNotAvailable(Level level)

Since the SoftAssert is used, it will show all the relevant level errors when the test is failed.由于使用了SoftAssert,当测试失败时会显示所有相关级别的错误。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM