Selenium 2 Chrome驱动程序偏好设置的Java等效于RubyBindings。

6

我一直在寻找使用Java设置Chrome驱动程序首选项的方法,但过去两天没有成功。

但是我已经通过RubyBindings找到了一个解决方案,并想知道是否有Java等效的代码行可用于此。

Ruby代码如下:

profile = Selenium::WebDriver::Chrome::Profile.new
profile['download.prompt_for_download'] = false
profile['download.default_directory'] = "/path/to/dir"

driver = Selenium::WebDriver.for :chrome, :profile => profile

在搜索时,我发现Chrome没有像FirefoxProfile类一样可以使用的分析器,所以我开始使用DesireCapabilities类。经过进一步调查,我发现可以通过capabilities.setCapability设置"switches"和"prefs",最终得到以下结果:

Map<String, String> prefs = new Hashtable<String, String>();
prefs.put("download.prompt_for_download", "false");
prefs.put("download.default_directory", "/path/to/dir");
prefs.put("download.extensions_to_open", "pdf");

DesiredCapabilities capabilities = DesiredCapabilities.chrome();
capabilities.setCapability("chrome.prefs", prefs);
dr = new ChromeDriver(capabilities);

然而,我无法使其正常工作,一旦开始就无法将默认下载目录更改为指定的目录。我不确定我尝试设置此功能的方式是否有问题,或者问题是否在其他地方。

最终,我最终使用了此处提出的解决方案:
http://dkage.wordpress.com/2012/03/10/mid-air-trick-make-selenium-download-files/

但我想知道是否可以更加清晰地直接设置偏好而不是使用 UI 来完成此操作。

任何帮助都将不胜感激,谢谢!

更新:
令人惊讶的是,将 Selenium 2 更新到版本 2.24.1(以及 Windows Chrome 22)后,上面的代码与 Maps 一起按预期工作,现在唯一的问题是它们已经弃用了构造函数 ChromeDriver(DesiredCapabilities capabilities),并建议我使用 ChromeOptions 类,但我无法让其在上述情况下起作用。

以下是维基页面,解释了ChromeOptions和DesiredCapabilities的用法: http://code.google.com/p/chromedriver/wiki/CapabilitiesAndSwitches
3个回答

2
Ruby绑定实际上将其扩展为:
{
   "download": {
      "prompt_for_download": false,
      "default_directory": "/path/to/dir"
    }
}

尝试按照这种方式构建您的Java首选项对象,看看是否有效。字符串与布尔值false之间的差异也可能是一个问题。

谢谢您的建议,我没有注意到绑定会这样扩展。不幸的是,这样做仍然没有帮助(我已经排除了“prompt_for_download”,因为Chrome默认情况下已经这样做,以避免可能存在的问题)。 - Zero4573

0

试试这个(请原谅我的 Java 已经很生疏了,但希望你能理解)

Dictionary download = new Dictionary();
download["default_directory"] = "/path/to/dir";
Dictionary prefs = new Dictionary();
prefs["browser"] = download;

DesiredCapabilities capabilities = DesiredCapabilities.chrome();
capabilities.setCapability("chrome.prefs", prefs);
WebDriver driver = new ChromeDriver(capabilities);

更新:我刚刚浏览了代码,似乎我上面建议的方法可能行不通。Ruby Chrome配置文件类会创建一个带有Chrome配置文件结构的zip文件,以支持Chrome偏好设置。我在Java中找不到这样的功能代码。Java中有一个Firefox配置文件,可以为Firefox执行类似的操作,但显然这对Chrome无效。因此,简而言之,Java目前尚不支持此功能。

从我所看到的,这个想法与jarib建议的相同,只是我们使用“浏览器”而不是“下载”。我也尝试过更改这个,但不幸的是这仍然没有使它工作(请注意,字典和哈希表都实现了Map,因此无论我使用字典还是哈希表都不应该有影响)。 - Zero4573
我在想,如果您为偏好设置创建一个JSON字符串会怎样呢?例如:capabilities.setCapability("chrome.prefs", "{"download": {"default_directory": "/path/to/dir"}}"); - KailuoWang
我刚刚浏览了代码,似乎我上面建议的方法也不行。Ruby Chrome Profile类会创建一个物理zip文件,并在其中创建Chrome配置文件结构,以支持Chrome偏好设置。我在Java中找不到这样的功能代码。虽然Java中有Firefox Profile可以为Firefox执行类似的操作,但显然这对Chrome无效。 - KailuoWang
是的,我确实注意到了Java中的Firefox配置文件,这就是为什么我认为Chrome中会有类似的东西。不幸的是,我找到的最接近的东西是Ruby中的某些内容... - Zero4573

0

新版本(我测试了Chrome 44.0.2403.125、Selenium 2.47.1和ChromeDriver 2.17.340128)可以使用以下内容:

ChromeOptions options = new ChromeOptions();
Map<String, Object> prefs = new HashMap<String, Object>();
prefs.put("download.default_directory", "/path/to/directory");
options.setExperimentalOption("prefs", prefs);
ChromeDriver chromeDriver = new ChromeDriver(options);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接