selenium + chrome. filessystem . chooseentry =无效的调用页面错误

selenium + chrome.fileSystem.chooseEntry = invalid calling page error

本文关键字:调用 错误 无效 chrome filessystem chooseentry selenium      更新时间:2023-09-26

我正在编写一个Selenium脚本来测试使用Chrome. filessystem . chooseentry API来选择目录的Chrome应用程序。当我手动操作时,它工作得很好。但是当我在Selenium脚本中这样做时,我得到了这个错误:

不受控制的运行时。运行文件系统时出现错误。选择条目:无效的呼叫页。这个函数不能从后台页面调用。

关于如何使Selenium和chooseEntry很好地发挥在一起的想法?

我更新到最新的Chromedriver,但仍然没有运气。我也看了看ChromeOptions,但没有看到任何看起来有用的东西。互联网上似乎没有太多关于Selenium和chooseEntry的内容。我用的是Chrome 51版。

我认为我需要一个特殊的javascript入口点来设置测试的路径值,而不是使用chooseEntry。但是我强烈希望我的测试不要有单独的代码执行路径。有人有更干净的解决方案吗?

编辑:根据评论者的要求,以下是违规代码:

chrome.fileSystem.chooseEntry({type:'openDirectory'},function(entry) {
  chrome.fileSystem.getWritableEntry(entry,function(writeable_entry) {
      console.log("got writeable entry");
  });
 }, function(e) { errorHandler(e); });

编辑#2:我使用了特殊的javascript入口点hack。在手动模式下——即,不在Selenium下运行——我运行执行chooseEntry的代码,然后使用retainEntry API获取条目id。我在javascript中添加了一个入口点,以获取条目id并调用restoreEntry API将其转换回条目。我还修改了我的代码,如果设置了这个条目对象,那么使用它作为文件,而不是调用chooseEntry。最后,我修改了我的Selenium脚本,以便在运行脚本的其余部分之前调用restoreEntry入口点。

这是不理想的,因为现在我的测试代码执行路径与我实际的控制下的人类代码执行路径有些不同。但至少它现在允许我使用Selenium脚本。当然,如果有人能想出一个不可怕的方法来解决这个问题,我很乐意听听。

编辑#3:根据@Xan的评论,将我的术语从"扩展"改为"Chrome应用程序"。

我只能提供这个可怕的hack。对于OSX下的Chrome应用程序,我创建了文件夹收藏夹,并使用Robot按键来导航和选择应用程序所需的"收藏夹"文件夹。唯一可能的可取之处是,它确实反映了与文件界面的有效/可能的实际人机交互。

private void selectOSXFolderFavorite(int favorite) {
    // With an OSX file folder dialog open, Shift-Tab to favorites list
    robot.keyPress(KeyEvent.VK_SHIFT);
    robot.keyPress(KeyEvent.VK_TAB);
    robot.keyRelease(KeyEvent.VK_TAB);
    robot.keyRelease(KeyEvent.VK_SHIFT);
    // move to the top of favorites list
    int i = 40;
    while (i-- > 0) {
        robot.keyPress(KeyEvent.VK_UP);
        robot.keyRelease(KeyEvent.VK_UP);
    }
    while (favorite-- > 0) {
        robot.keyPress(KeyEvent.VK_DOWN);
        robot.keyRelease(KeyEvent.VK_DOWN);
    }
    // Send an enter key to Select the selected folder
    robot.keyPress(KeyEvent.VK_ENTER);
    robot.keyRelease(KeyEvent.VK_ENTER);
}