我打算创建一个Android应用程序,执行无头登录网站,然后从后续页面抓取一些内容,同时保持登录会话.
我首先在普通的Java项目中使用了HtmlUnit,它运行得很好.但后来发现HtmlUnit与Android不兼容.
然后我通过向登录表单发送HTTP"POST"请求来尝试JSoup库.但由于JSoup不支持JavaScript,因此生成的页面不会完全加载.
然后我建议看看Selendroid,它实际上是一个android测试自动化框架.但我真正需要的是一个支持JavaScript和Android的Html解析器.我发现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)
并且,
我使用 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)
但我想对静态方法做同样的事情。
imgView.setImageTintList(getResources()
.getColorStateList(R.color.my_clr_selector));
Run Code Online (Sandbox Code Playgroud)
它说'呼叫需要API级别21'.
如何在API 21以下的Android设备上运行?
我可以通过使用它使它工作,ImageView#setColorFilter()但我更喜欢使用一个ColorStateList来设置色调.
我有一个读取系统属性的类加载器应用程序 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选项。只需要路径值。
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不对代码进行任何缩小或优化的情况下禁用日志记录并缩小资源呢?
java.util.regex.Matcher在覆盖本机类(例如在非模块化代码库中)时,如何使用自定义类路径。
基本上我想做的是使用不同的类路径,就像--class-path build/custom修补类时一样。因为修改后的 Matcher.java 引用了编译为build/custom.
假设我已经修改了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 …
我正在开发一个代码库,它使用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及更高版本:
android ×3
java ×3
java-9 ×2
java-module ×2
classpath ×1
java-10 ×1
java-platform-module-system ×1
javac ×1
jnienv ×1
junit5 ×1
jvm ×1
mockito ×1
proguard ×1
selendroid ×1
selenium ×1
string ×1
web-scraping ×1