我使用以下代码尝试创建一个使用Selenium的Java程序(在Eclipse Neon中)。我尝试了一大堆不同的反斜杠和正斜杠组合,例如"C://Users/talai/..."和"C:\Users\talai"等,但没有任何效果。
下面是我的代码:
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Action;
import org.openqa.selenium.interactions.Actions;
import java.awt.Dimension;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.Keys;
import org.openqa.selenium.Point;
public class Run {
public static void main(String[] args) throws InterruptedException {
for(int d=0; d<20; d++)//run program d<___ times
{
//One "Play" session = 5m 15s
//One "Collect" session = ???
System.out.println("Session " +d+ " of 300 starting...");
System.setProperty("webdriver.chrome.driver", "C://Users/talai/Desktop/code/ChipCollector/chromedriver.exe");
WebDriver driver = new ChromeDriver();
这是输出:
Session 0 of 300 starting...
Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/base/Function
at myVegas.Run.main(Run.java:44)
Caused by: java.lang.ClassNotFoundException: com.google.common.base.Function
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 1 more
几句话:
-
根据最佳做法,您不应该在没有任何适当的用例和适当硬件可用性的情况下一次打开20个ChromeDriver和Chrome 浏览器实例。因此,您需要删除
for()
循环,如下所示:for(int d=0; d<20; d++)
-
Java中的系统路径通过双反斜杠(
\
)或单正斜杠(/
)表示。两者的工作方式相同。 -
您看到的错误说明了一切:
Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/base/Function at myVegas.Run.main(Run.java:44) Caused by: java.lang.ClassNotFoundException: com.google.common.base.Function
该错误意味着java.lang.NoClassDefFoundError是由java.lang.ClassNotFoundException引发的。
什么是NoClassDefFoundError
Java 中的NoClassDefFoundError
发生在Java Virtual Machine
无法在运行时找到在编译时可用的特定类时。例如,如果我们解析了来自类的方法调用或访问类的任何静态成员,并且该类在运行时不可用,那么JVM
将抛出NoClassDefFoundError
。
这清楚地表明Selenium正在尝试在运行时从导入org.openqa.selenium.chrome.ChromeDriver解析ChromeDriver类;该类不再可用。
出了什么问题:
从上述几点可以清楚地看出,相关的Class
或Methods
是从Run Time
期间不可用的一个源Compile Time
解决的。
如果存在多个源来解析Classes
并Methods
为:
- 在您的项目空间中存在来自selenium-java-3.9.1 的 selenium-server-standalone-3.9.1JAR和JAR。
- 存在硒服务器独立-3.9.1JAR和Maven相关的JARs。
- 存在硒服务器独立-3.9.1JAR和Gradle相关的JARs。
溶液:
以下是解决NoClassDefFoundError
的几个步骤:
- 使用 Selenium-server-standalone-3.9.1JAR或selenium-java-3.9.1中的JAR 。
- 如果使用构建工具(例如Maven或Gradle),请从Java 构建路径中删除所有外部 JAR。Maven或Gradle将下载并解析所有必需的依赖项。
- 如果在 Java项目中使用Selenium JAR,则仅在Java 构建路径中添加所需的外部 JAR,并删除未使用的JAR。
- 使用Maven时,请使用
<artifactId>selenium-java</artifactId>
或<artifactId>selenium-server</artifactId>
.避免同时使用两者。 - 从
pom.xml
中删除不需要的其他<dependency>
- 定期清理 IDE 中的项目工作区,以便使用所需的依赖项生成项目。
- 使用CCleaner工具定期清除操作系统琐事。
- 当你执行一个Maven项目时,总是做
maven clean
,maven install
然后maven test
如果您的 Web 浏览器 - 基本版本太旧,请通过Revo 卸载程序卸载 Web 浏览器,并安装最新 GA 发布的Web 浏览器版本。
您的 JRE 找不到类。它找不到类 com.google.common.base.Function,因为您没有将其添加到类路径中。
只需根据适合的版本在项目类路径中简单添加适当的硒独立。它应该这样做。
希望它有帮助。