小编Gay*_*tti的帖子

Selendroid作为网络刮刀

我打算创建一个Android应用程序,执行无头登录网站,然后从后续页面抓取一些内容,同时保持登录会话.

我首先在普通的Java项目中使用了HtmlUnit,它运行得很好.但后来发现HtmlUnit与Android不兼容.

然后我通过向登录表单发送HTTP"POST"请求来尝试JSoup库.但由于JSoup不支持JavaScript,因此生成的页面不会完全加载.

然后我建议看看Selendroid,它实际上是一个android测试自动化框架.但我真正需要的是一个支持JavaScript和Android的Html解析器.我发现Selendroid很难理解哪些我甚至无法弄清楚要使用哪些依赖项.

  • selendroid客户端
  • selendroid-独立
  • selendroid服务器

使用Selenium WebDriver,代码将如下所示.但有人可以向我展示一个类似Selendroid的代码示例吗?

    WebDriver driver = new FirefoxDriver();
    driver.get("https://mail.google.com/");

    driver.findElement(By.id("email")).sendKeys(myEmail);
    driver.findElement(By.id("pass")).sendKeys(pass);

    // Click on 'Sign In' button
    driver.findElement(By.id("signIn")).click();
Run Code Online (Sandbox Code Playgroud)

并且,

  1. 要添加到Gradle.Build文件的依赖项是什么?
  2. 要导入哪些Selendroid库?

selenium android web-scraping selendroid

13
推荐指数
1
解决办法
2416
查看次数

Mockito 使用 Mockito.mockStatic 不做任何事情

我使用 Mockito 和mockito-inline来模拟静态方法。我正在尝试将doNothing类似的行为应用于静态 void 方法。以下解决方法有效,但我认为应该有一种更方便的方法来用更少的代码实现此目的。

try (MockedStatic<UtilCalss> mock = Mockito.mockStatic(UtilCalss.class)) {

     mock.when(() -> UtilCalss.staticMethod(any()))
            .thenAnswer((Answer<Void>) invocation -> null);

}
Run Code Online (Sandbox Code Playgroud)

如果它是一个非静态方法,我们可以简单地这样做:

doNothing().when(mock).nonStaticMethod(any());
Run Code Online (Sandbox Code Playgroud)

但我想对静态方法做同样的事情。

mockito junit5

13
推荐指数
2
解决办法
3万
查看次数

如何在Android API <21上使用setImageTintList()

imgView.setImageTintList(getResources()
      .getColorStateList(R.color.my_clr_selector));
Run Code Online (Sandbox Code Playgroud)

它说'呼叫需要API级别21'.

如何在API 21以下的Android设备上运行?

我可以通过使用它使它工作,ImageView#setColorFilter()但我更喜欢使用一个ColorStateList来设置色调.

android android-support-library

11
推荐指数
2
解决办法
5477
查看次数

如何在 JDK 9 或更高版本中获取引导类路径

我有一个读取系统属性的类加载器应用程序 sun.boot.class.path

但是我在 JDK 9 的发行说明中发现此属性已被删除。

 System.getProperty("sun.boot.class.path"); // In JDK 9/10 this returns null 
Run Code Online (Sandbox Code Playgroud)

但是我还是想在JDK 10中检索这个属性值,怎么做呢?

我期待如下值:

/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/resources.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/rt.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/sunrsasign.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/jsse.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/jce.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/charsets.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/jfr.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/classes
Run Code Online (Sandbox Code Playgroud)

供参考:

我不想使用该-Xbootclasspath选项。只需要路径值。

java classpath bootclasspath java-9 java-module

8
推荐指数
1
解决办法
4105
查看次数

仅使用Proguard禁用日志记录并缩小资源

build.gradle:

buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.SginConfig
        }
}
Run Code Online (Sandbox Code Playgroud)

我不希望Proguard优化或混淆我的代码,因为这给我带来了很多麻烦。我只想删除日志调用并启用未使用资源的缩减。

proguard-rules.pro:

-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(java.lang.String, int);
    public static int w(...);
    public static int d(...);
    public static int e(...);
}
Run Code Online (Sandbox Code Playgroud)

添加上面的代码proguard-rules.pro工作,只有当我设置getDefaultProguardFile从('proguard-android.txt')('proguard-android-optimize.txt')

但是通过将其设置为proguard-android-optimize.txt可以启用我不需要的优化标志。

那么,如何在Proguard不对代码进行任何缩小或优化的情况下禁用日志记录并缩小资源呢?

android proguard android-gradle-plugin android-proguard

5
推荐指数
1
解决办法
1039
查看次数

如何将 --patch-module 与 --class-path 一起使用 | javac

java.util.regex.Matcher在覆盖本机类(例如在非模块化代码库中)时,如何使用自定义类路径。

基本上我想做的是使用不同的类路径,就像--class-path build/custom修补类时一样。因为修改后的 Matcher.java 引用了编译为build/custom.

IE:

假设我已经修改了java.util.regex.Matcher,现在它需要一些其他(非 java)external.jar 才能运行。

那么我怎样才能像这样修补它: javac --patch-module java.base=src,以便它也找到 external.jar 中的类。

原案

目录结构:

+- build  
+- src
     +- PATCH
          +- java
             +- util
                +- regex
                      +- Matcher.java

     +- CUSTOM
          +- com
             +- example
                  +- MyClass.java
Run Code Online (Sandbox Code Playgroud)

两个类如下:

java.util.regex.Matcher:

package java.util.regex;

class Matcher {
        com.example.MyClass myClass;
}
Run Code Online (Sandbox Code Playgroud)

com.example.MyClass:

package com.example;    

public class MyClass {
}
Run Code Online (Sandbox Code Playgroud)

情况1

这有效:

javac -d build src/CUSTOM/com/example/MyClass.java
javac -d build --patch-module java.base=src src/PATCH/java/util/regex/Matcher.java
Run Code Online (Sandbox Code Playgroud)

案例#2

但是如果我将 MyClass …

java javac java-platform-module-system java-9 java-module

5
推荐指数
0
解决办法
5319
查看次数

Java字符串是否根据它们的构造方式以不同方式存储在堆中?

我正在开发一个代码库,它使用JNI技术来构建本机方法.

以下是用于的本机对等方法的段 java.lang.String#equals(Object)

@MJI
public boolean equals__Ljava_lang_Object_2__Z (MJIEnv env, int objRef, int argRef) {

    ElementInfo s1 = heap.get(objRef); // this
    ElementInfo s2 = heap.get(argRef);

    Fields f1 = heap.get(s1.getField("value")).getFields();
    Fields f2 = heap.get(s2.getField("value")).getFields();

    char[] c1 = ((CharArrayFields) f1).asCharArray();
    char[] c2 = ((CharArrayFields) f2).asCharArray();
Run Code Online (Sandbox Code Playgroud)

这在Java 8上运行良好.但是在Java 9及更高版本中,valueString字段返回的值是char[]或者byte[]

我希望它返回一个byte []数组,因为在JEP 254:Compact Strings中进行了更改


例如:

char[] chars = new char[] {'a','b','c', 'd'};
String str1 = new String(chars))
"str2".equals(str1);
Run Code Online (Sandbox Code Playgroud)

在这里,我在对等方法中获取了char数组str1和字节数组"str2".这是因为字符串在堆中的存储方式不同吗?


供参考:

这是我正在实际工作的代码.我正在尝试使用Java 9及更高版本:

JPF核/ SRC …

java string jvm jnienv java-10

5
推荐指数
0
解决办法
164
查看次数