【问题标题】:File path declaration not visible to Method call in Main method文件路径声明对 Main 方法中的方法调用不可见
【发布时间】:2016-11-09 02:19:36
【问题描述】:

我正在开发一个应用程序,该应用程序将用于使用 Selenium 在 Java 中自动执行表单填写操作。我目前已经将两者都设置为在拇指驱动器上便携。我的代码如下:

package AutoFill;

import java.io.File;
import java.util.concurrent.*;
import javafx.application.Application.*;
import javafx.application.*;
import javafx.stage.Stage;
import org.openqa.selenium.*;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.ie.*;
import org.openqa.selenium.ie.InternetExplorerDriver.*;

public class Login extends Application {

    public static final File file = new File("E:/IEDriverServer_Win32_2.53.1/IEDriverServer.exe");      //path to IEDriver on USB stick
    public static final DesiredCapabilities desCaps = DesiredCapabilities.internetExplorer();           //new desired capabilities object to set IEDriver run params
    public static final WebDriver driver = new InternetExplorerDriver(desCaps);                         //new IEDriver instance
    public static final String url = new String("url_here");                                    //starting url  


@Override
public void start(Stage primaryStage) { 
    primaryStage.show();

}

public void setup() {

    File file = new File("E:/IEDriverServer_Win32_2.53.1/IEDriverServer.exe");
    System.setProperty("webdriver.ie.driver", file.getAbsolutePath());               //force IEDriver path
    setIEDesCaps(desCaps);                                                           //run cap setter method
    driver.findElement(By.tagName("html")).sendKeys(Keys.chord(Keys.CONTROL,"0"));   //set screen zoom to 100% to resolve webdriver errors
    driver.get(url);                                                                 //navigate to url



}


public void setIEDesCaps(DesiredCapabilities desCaps) {                              //setter method to establish IE webdriver run params                

    desCaps.setPlatform(org.openqa.selenium.Platform.WINDOWS);
    desCaps.setCapability("EnableNativeEvents", false);
    desCaps.setCapability("ignoreZoomSetting", true);
    desCaps.setJavascriptEnabled(true);

}

}

运行这段代码时(当然是使用真实的 url),Eclipse 会产生以下错误:

 java.lang.IllegalStateException: The path to the driver executable must be set by the webdriver.ie.driver system property;

我实际上尝试在两个不同的实例中手动设置驱动程序路径 - 一开始是作为静态变量(这似乎是最明智的),以及在主 setup() 方法中。单独地(当注释掉一个或另一个时),驱动程序路径的放置对 main 方法都是不可见的。在我将 Login 类转换为 Application.

如何在当前代码中定位文件路径,使其对 main 方法可见?我觉得我在这里遗漏了一些东西。

【问题讨论】:

  • file.getAbsolutePath() 返回什么?当路径已经是绝对路径时使用它似乎是多余的。
  • 为什么要两次声明文件?一次是课堂上的final,一次是setup()
  • file 被声明了两次,但在编译之前在任一实例中都被注释掉了。双重声明用于测试是否放在setup()中。如果我没记错的话,file.getAbsolutePath() 只是用于将路径从file 传递到System.setProperty()。不过,这是可回收的代码,您可能对冗余是正确的。也许我应该去掉中间人,直接用绝对路径替换System.setProperty()?这应该允许我一起跳过声明。

标签: java internet-explorer selenium browser-automation selenium-iedriver


【解决方案1】:

在类中将变量声明为Public Static Final,您应该可以在main方法中访问它(classname.variablename)。 如果您不使用属性文件,那将是理想的位置。

如果您可以分享 Main() 方法,我可以进一步研究。

注意:我目前无权发表评论,因此必须发帖。不过,这可能不是一个完整的答案。

【讨论】:

  • 这实际上比评论格式更适合答案格式。
  • 在这种情况下,主要方法是setup(),或者我认为.. 是的,我假设通过在类中将其声明为 Public Static Final,它将在 setup() 中可见.不是这样吗?我应该声明一个特定的Main(String[] args) 吗?
  • 好吧,这就是我认为可能存在的问题。您甚至在设置 webdriver.ie.driver public static final WebDriver driver =newInternetExplorerDriver(desCaps); 的路径之前尝试启动浏览器您可能希望在启动驱动程序之前设置属性 webdriver.ie.driver。
  • 我按照你的建议做了,这解决了这个问题 - 有点。我的代码编译后,打开了一个 Java 应用程序窗口,然后有点停滞不前。这让我意识到 Selenium 可能不喜欢尝试从 JavaFX 阶段中激活 webdriver 实例,因此我完全取消了 JavaFX 代码和 Application 类的扩展。我声明了一个特定的 public static final Main() 方法,并在 Login() 类的新实例上调用了 setIEDesCaps() 方法 - 现在它可以工作了!感谢您的帮助。
猜你喜欢
  • 2011-11-20
  • 2020-12-17
  • 2019-07-04
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
相关资源
最近更新 更多