org.openqa.selenium.JavascriptException:javascript错误:$未定义错误使用ChromeDriver selenium与Ashot拍摄坐标屏幕截图

org.openqa.selenium.JavascriptException:javascript错误:$未定义错误使用ChromeDriver selenium与Ashot拍摄坐标屏幕截图,java,google-chrome,selenium-webdriver,selenium-chromedriver,ashot,Java,Google Chrome,Selenium Webdriver,Selenium Chromedriver,Ashot,我在使用AShot时遇到了一个奇怪的问题。 Ashot适用于整个屏幕截图,但选择性屏幕截图不好。 在获取元素坐标时,它在CoordsProvider类中抛出错误。 我使用的是有缺陷的版本还是产品 public abstract class CoordsProvider implements Serializable { public abstract Coords ofElement(WebDriver driver, WebElement element); public Set<C

我在使用AShot时遇到了一个奇怪的问题。
Ashot
适用于整个屏幕截图,但选择性屏幕截图不好。 在获取元素坐标时,它在CoordsProvider类中抛出错误。 我使用的是有缺陷的版本还是产品

public abstract class CoordsProvider implements Serializable {

public abstract Coords ofElement(WebDriver driver, WebElement element);

public Set<Coords> ofElements(WebDriver driver, Iterable<WebElement> elements) {
    Set<Coords> elementsCoords = new HashSet<>();
    for (WebElement element : elements) {
        ***Coords elementCoords = ofElement(driver, element);  //fails here***
        if (!elementCoords.isEmpty()) {
            elementsCoords.add(elementCoords);
        }
    }
    return Collections.unmodifiableSet(elementsCoords);
}

@SuppressWarnings("UnusedDeclaration")
public Set<Coords> ofElements(WebDriver driver, WebElement... elements) {
    return ofElements(driver, Arrays.asList(elements));
}

@SuppressWarnings("UnusedDeclaration")
public Set<Coords> locatedBy(WebDriver driver, By locator) {
    return ofElements(driver, driver.findElements(locator));
}
}
欢迎提供Ashot的任何帮助或替代方案,请帮助我了解此信息。

此错误消息

org.openqa.selenium.JavascriptException: javascript error: $ is not defined
  (Session info: chrome=79.0.3945.130)
Build info: version: '3.14.0', revision: 'aacccce0', time: '2018-08-02T20:19:58.91Z'
System info: host: 'OPTIMIZEQ-LTP03', ip: '192.168.99.1', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '11.0.2'
Driver info: org.openqa.selenium.remote.RemoteWebDriver
Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 79.0.3945.130, chrome: {chromedriverVersion: 78.0.3904.105 (60e2d8774a81..., userDataDir: C:\Users\SHAILE~1.SIN\AppDa...}, goog:chromeOptions: {debuggerAddress: localhost:61006}, javascriptEnabled: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: XP, platformName: XP, proxy: Proxy(manual, http=localhos..., setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webdriver.remote.sessionid: f5a47b27537f019dacb73462732...}
…意味着ChromeDriver无法与浏览上下文交互,即Chrome浏览器会话


深潜 根据文档中的说明,此错误意味着在中的某个位置引用了一个不存在的变量。需要声明此变量,或者需要确保它在当前脚本或范围中可用

提示:加载库(如jQuery)时,请确保在访问库变量(如“$”)之前已加载该库。将加载库的标记放在使用它的代码之前

根据讨论,@Ketan提到,当您的脚本没有使用jQuery时,就会发生此错误,也就是说,//可能没有完成渲染


解决方案 在这些情况下,有3(三)种不同的方法可用于解决问题,如下所示:

<head>
    <script src="jquery-3.4.1.min.js"></script>
</head> 
  • jQuery库是一个单独的JavaScript文件,您可以使用
    部分中的HTML
    标记引用它,如下所示:

    <head>
        <script src="jquery-3.4.1.min.js"></script>
    </head> 
    
    此方法将其中一个参数(最后一个)作为元素,但在定义时,您似乎将其视为元素列表,如中所示:

    @SuppressWarnings("UnusedDeclaration")
    public Set<Coords> ofElements(WebDriver driver, WebElement... elements) {
        return ofElements(driver, Arrays.asList(elements));
    }   
    
    @SuppressWarnings(“未使用声明”)
    公共元素集(WebDriver驱动程序、WebElement…元素){
    返回元素(驱动程序、数组、asList(元素));
    }   
    
    这里的参数类型似乎不匹配


    其他考虑事项 你还需要注意几件事:

    • 您使用的是chromedriver=78.0.3904.105
    • 的发行说明明确提到以下内容:
    支持Chrome 78版

    • 您使用的是chrome=79.0
    • 的发行说明明确提到以下内容:
    支持Chrome 79版

    • 您的Selenium客户端版本是2018-08-02T20:19:58.91Z的3.14.0,比以前的版本快了1.5年
    • 您的JDK版本是11.0.2
    因此,JDK v8u111、Selenium客户端v3.3.1、ChromeDriver v2.41和Chrome浏览器v79.0之间存在明显的不匹配


    解决方案 确保:

    • JDK已升级到当前级别
    • 硒被提升到当前水平
    • ChromeDriver已更新到当前级别
    • Chrome更新至当前Chrome版本80.0级别。(根据)
    此错误消息

    org.openqa.selenium.JavascriptException: javascript error: $ is not defined
      (Session info: chrome=79.0.3945.130)
    Build info: version: '3.14.0', revision: 'aacccce0', time: '2018-08-02T20:19:58.91Z'
    System info: host: 'OPTIMIZEQ-LTP03', ip: '192.168.99.1', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '11.0.2'
    Driver info: org.openqa.selenium.remote.RemoteWebDriver
    Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 79.0.3945.130, chrome: {chromedriverVersion: 78.0.3904.105 (60e2d8774a81..., userDataDir: C:\Users\SHAILE~1.SIN\AppDa...}, goog:chromeOptions: {debuggerAddress: localhost:61006}, javascriptEnabled: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: XP, platformName: XP, proxy: Proxy(manual, http=localhos..., setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webdriver.remote.sessionid: f5a47b27537f019dacb73462732...}
    
    …意味着ChromeDriver无法与浏览上下文交互,即Chrome浏览器会话


    深潜 根据文档中的说明,此错误意味着在中的某个位置引用了一个不存在的变量。需要声明此变量,或者需要确保它在当前脚本或范围中可用

    提示:加载库(如jQuery)时,请确保在访问库变量(如“$”)之前已加载该库。将加载库的标记放在使用它的代码之前

    根据讨论,@Ketan提到,当您的脚本没有使用jQuery时,就会发生此错误,也就是说,//可能没有完成渲染


    解决方案 在这些情况下,有3(三)种不同的方法可用于解决问题,如下所示:

    <head>
        <script src="jquery-3.4.1.min.js"></script>
    </head> 
    
    • jQuery库是一个单独的JavaScript文件,您可以使用
      部分中的HTML
      标记引用它,如下所示:

      <head>
          <script src="jquery-3.4.1.min.js"></script>
      </head> 
      
      此方法将其中一个参数(最后一个)作为元素,但在定义时,您似乎将其视为元素列表,如中所示:

      @SuppressWarnings("UnusedDeclaration")
      public Set<Coords> ofElements(WebDriver driver, WebElement... elements) {
          return ofElements(driver, Arrays.asList(elements));
      }   
      
      @SuppressWarnings(“未使用声明”)
      公共元素集(WebDriver驱动程序、WebElement…元素){
      返回元素(驱动程序、数组、asList(元素));
      }   
      
      这里的参数类型似乎不匹配


      其他考虑事项 你还需要注意几件事:

      • 您使用的是chromedriver=78.0.3904.105
      • 的发行说明明确提到以下内容:
      支持Chrome 78版

      • 您使用的是chrome=79.0
      • 的发行说明明确提到以下内容:
      支持Chrome 79版

      • 您的Selenium客户端版本是2018-08-02T20:19:58.91Z的3.14.0,比以前的版本快了1.5年
      • 您的JDK版本是11.0.2
      因此,JDK v8u111、Selenium客户端v3.3.1、ChromeDriver v2.41和Chrome浏览器v79.0之间存在明显的不匹配


      解决方案 确保:

      • JDK已升级到当前级别
      • 硒被提升到当前水平
      • ChromeDriver已更新到当前级别
      • Chrome更新至当前Chrome版本80.0级别。(根据)
        • 我在这里找到了一个解决方案。基本上,它将jquery注入到页面中。 因此,我按照步骤创建了这个方法,我在调用AShot方法之前使用了这个方法,可以解决这个问题,将代码留在这里:

                  JavascriptExecutor js = (JavascriptExecutor) driver;
                  if(!(Boolean) js.executeScript("return (typeof jQuery != \"undefined\")")) {
                      js.executeScript(
                              "var headID = document.getElementsByTagName('head')[0];" +
                                      "var newScript = document.createElement('script');" +
                                      "newScript.type = 'text/javascript';" +
                                      "newScript.src = 'https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js';" +
                                      "headID.appendChild(newScript);");
                      WebDriverWait waitJQ = new WebDriverWait(driver, 30);
                      Function<WebDriver, Boolean> jQueryAvailable = WebDriver -> (
                              (Boolean) js.executeScript("return (typeof jQuery != \"undefined\")")
                      );
                      waitJQ.until(jQueryAvailable);
                  }
          
          JavascriptExecutor js=(JavascriptExecutor)驱动程序;
          if(!(布尔)js.executeScript(“return(typeof jQuery!=\“undefined\”)){
          js.executeScript(
          “var headID=docume