【问题标题】:Use Gmail API in a keyword in Katalon Studio在 Katalon Studio 的关键字中使用 Gmail API
【发布时间】:2021-06-21 00:10:33
【问题描述】:

我使用本教程连接到 Gmail API:https://developers.google.com/gmail/api/quickstart/java 我想在 Katalon Studio 中创建一个依赖于 Gmail API 的关键字。 我从示例代码中修改了该行:

InputStream in = GmailQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH);

到这里:

InputStream ins = new FileInputStream(CREDENTIALS_FILE_PATH);

已添加 JAR 文件,项目正在运行并打开浏览器窗口以获取令牌。成功授权后,我收到错误消息:

引起:java.lang.NoSuchMethodError: com.google.api.client.http.HttpRequest.setResponseReturnRawInputStream(Z)Lcom/google/api/client/http/HttpRequest;

更新:导入的依赖列表:

commons-codec-1.15.jar
commons-logging-1.2.jar
google-api-client-1.31.3.jar
google-api-client-extensions-1.6.0-beta.jar
google-api-client-jackson2-1.31.3.jar
google-api-client-java6-1.31.3.jar
google-api-services-gmail-v1-rev110-1.25.0.jar
google-http-client-1.39.1.jar
google-http-client-jackson2-1.39.1.jar
google-oauth-client-java6-1.31.4.jar
google-oauth-client-jetty-1.31.4.jar
guava-30.1.1-jre.jar
httpclient-4.5.13.jar
httpcore-4.4.14.jar
j2objc-annotations-1.3.jar
jackson-core-2.12.2.jar
jsr305-3.0.2.jar

【问题讨论】:

  • 这能回答你的问题吗? How do I fix a NoSuchMethodError?
  • @DaImTo :我导入了所有必要的类,看不到冲突,而且我看到版本号也是正确的。
  • 您的代码不正确。您正在尝试在 HttpRequest 对象上调用 setResponseReturnRawInputStream。并且您正在使用的参数没有这种方法
  • 没有代码无法为您提供帮助
  • @daggett : 问题是由 KS 引起的,因为其中有这个包的内置版本作为插件。但这是一个较旧的版本,不包含该方法。

标签: groovy gmail gmail-api katalon-studio katalon


【解决方案1】:

https://docs.katalon.com/katalon-studio/docs/external-libraries.html#exclude-built-in-libraries

通过删除存储在项目文件夹的 .classpath 文件中的内置库的功能,您可以将内置库替换为外部库,以便在测试项目中灵活使用库。

要求

  • 有效的 Katalon Studio Enterprise 许可证。
  • Katalon Studio 7.8 版。

UPD:

我得到了 katalon 7.9.1 以及我是如何做到的:

将以下类添加到 KS 项目中:

include/scripts/groovy/(默认包)/GroovyBox.java

import groovy.lang.*;
import java.util.regex.Pattern;
import java.util.Map;
import java.util.List;

/** run groovy script in isolated classloader*/
public class GroovyBox {
    GroovyShell gs;
    
    public GroovyBox(ClassLoader parentCL, Pattern excludeClassPattern ) {
        FilteredCL fcl = new FilteredCL(parentCL, excludeClassPattern);
        gs = new GroovyShell(fcl);
    }
    
    public GroovyBox withClassPath(List<String> classPathList) {
        GroovyClassLoader cl = gs.getClassLoader();
        for(String cp: classPathList) cl.addClasspath(cp);
        return this;
    }
    
    public Script parse(String scriptText) {
        return gs.parse(scriptText);
    }
    
    public static class FilteredCL extends GroovyClassLoader{
        Pattern filterOut;
        
        public FilteredCL(ClassLoader parent,Pattern excludeClassPattern){
            super(parent);
            filterOut = excludeClassPattern;
        }
        
        @Override protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException{
            if(filterOut.matcher(name).matches())throw new ClassNotFoundException("class not found "+ name);
            return super.loadClass(name, resolve);
        }
    }
}

现在添加一个测试用例 - 实际上您可以将代码从测试用例移动到一个类中...

import ... /* all katalon imports here*/

assert method1() == 'HELLO WORLD'

def method1() {
    def gb = new GroovyBox(this.getClass().getClassLoader().getParent(), ~/^com\.google\..*/)
    def script = gb.parse('''
            @Grab(group='com.google.api-client', module='google-api-client', version='1.31.3')
            import com.google.api.client.http.HttpRequest

            def c = HttpRequest.class
            println( "methods execute:: "+c.methods.findAll{it.name=='execute'} )
            println( "methods setResponseReturnRawInputStream:: "+c.methods.findAll{it.name=='setResponseReturnRawInputStream'} )
            println greeting
            return greeting.toUpperCase()
        ''')
    script.setBinding([greeting:'hello world'] as Binding)
    return script.run()
}

定义外部依赖的选项:

  • @Grab(...) 作为解析脚本的第一行 - 从 maven Central 加载所有必需的依赖项(默认情况下)。例如@Grab(group='com.google.api-client', module='google-api-client', version='1.31.3') 对应于this artifact
  • 有时你需要指定特定的maven仓库然后添加@GrabResolver(name='central', root='https://repo1.maven.org/maven2/')
  • 如果你想指定本地文件依赖,那么在上面的代码中:
def gb = new GroovyBox(...).withClassPath([
    '/path/to/lib1.jar',
    '/path/to/lib2.jar'
])

【讨论】:

  • 谢谢,但是我用的是免费版的KS,所以不能用这个功能。
  • 我添加了如何使用自定义类加载器执行脚本的想法
  • 我收到以下错误消息:Groovy:unexpected token: @ 这是给@Grab。
  • 已下载 KS - 对答案进行了更改
  • 我增加了对定义本地库的支持和一些关于抓取的解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多