Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当用户选择具有正确扩展名的文件时,会触发什么类型的事件?_Javascript_Jquery_Selenium_File Upload - Fatal编程技术网

Javascript 当用户选择具有正确扩展名的文件时,会触发什么类型的事件?

Javascript 当用户选择具有正确扩展名的文件时,会触发什么类型的事件?,javascript,jquery,selenium,file-upload,Javascript,Jquery,Selenium,File Upload,我正在编写一些脚本,以便在用户上传excel文件后捕获某些错误字符串。我现在遇到的问题是在UI中有一个元素需要单击,它会弹出一个依赖于操作系统的本机文件选择窗口,在用户选择扩展名为“.xlsx”的正确文件后,UI中将创建两个按钮:1。上传,2删除。用户按下“上载”按钮后,将验证uploade.xlsx文件,然后相应地生成错误消息 当我们使用selenium时,必须使用隐藏的输入web元素上传文件。我使用javascript使其可见,并使用该元素上载excel文件。下面是代码的外观: Fi

我正在编写一些脚本,以便在用户上传excel文件后捕获某些错误字符串。我现在遇到的问题是在UI中有一个元素需要单击,它会弹出一个依赖于操作系统的本机文件选择窗口,在用户选择扩展名为“.xlsx”的正确文件后,UI中将创建两个按钮:1。上传,2删除。用户按下“上载”按钮后,将验证uploade.xlsx文件,然后相应地生成错误消息

当我们使用selenium时,必须使用隐藏的输入web元素上传文件。我使用javascript使其可见,并使用该元素上载excel文件。下面是代码的外观:

    File fileToUpload = new File(
        "testData/SSP/Page/guidedbuying/S4SupplierManagementAdministrationPage/LandingPages.xlsx");
    setElementVisible("landingPageExcelInput");
    WebElement e = findElement(AwBy.xpath(
        "//input[@id='landingPageExcelInput']"));
    selectFileForUpload(e, fileToUpload);
但是当我这样做时,上面提到的两个UI按钮(Upload、Remove)将不会出现,因此自动化代码无法触发excel文件的验证

有人能告诉我一些想法吗,当用户上传具有正确文件类型的文件时,会触发什么类型的事件,以便我可以使用javascript执行相同的操作


一般来说,使用Javascript在页面上触发事件是个坏主意。当你这样做的时候,像这样的事情会发生,因为你没有按照页面设计的方式与页面交互。。。正如用户所希望的那样。我的建议是像用户一样与页面交互。如果用户必须单击某个按钮才能使控件可见,请单击该按钮。一旦您这样做,这个问题很可能会得到解决。

从HTML的外观来看,单击“选择文件”将启动侦听器,并将单击转发到隐藏的输入,该输入将依次显示操作系统文件对话框

因此,这里的问题可能不在于发出的事件,而在于页面是否正在侦听它们

我的猜测是,当您简单地在输入上设置文件时,页面没有侦听事件。您可能需要首先单击“选择文件”,但它将显示操作系统文件对话框,而Selenium无法处理该对话框

处理这种情况的一种方法是覆盖
上的单击以避免出现对话框,执行单击并使用sendKeys设置文件:

// disable the OS dialog triggered via code on an `<input>` file
((JavascriptExecutor)driver).executeScript(
    "HTMLInputElement.prototype.click = function() { " +
    "  if(this.type !== 'file')                      " +
    "     HTMLElement.prototype.click.call(this);    " +
    "};                                              " );

// initiate the upload
driver.findElement(By.cssSelector("[translate='adminPage_CHOOSE_FILE']"))
      .click();

// assign a file to the `<input>`
driver.findElement(By.cssSelector("input[type=file]"))
      .sendKeys(File("full file path").getAbsolutePath());
//禁用通过``文件上的代码触发的操作系统对话框
((JavascriptExecutor)驱动程序).executeScript(
“HTMLInputElement.prototype.click=函数(){”+
“如果(this.type!=='file')”+
“HTMLElement.prototype.click.call(this);”+
"};                                              " );
//启动上传
driver.findElement(由.cssSelector(“[translate='adminPage\u CHOOSE\u FILE']”)创建)
。单击();
//将文件分配给``
driver.findElement(由.cssSelector(“输入[type=file]”)创建)
.sendKeys(文件(“完整文件路径”).getAbsolutePath();

谢谢Franker,因为代码没有使用元素,所以上面有一个事件监听器,在我将其设置为可见后,它甚至不可单击,输入元素不可见且未使用。您使用的是哪个浏览器/驱动程序/版本,您尝试过其他浏览器/驱动程序/版本?您可以从屏幕截图中添加与对话框相关的HTML吗?@Florent B,我上传了HTML源代码,我正在使用Firefox47.0和selenium 2。谢谢。你上传的是截图,不是HTML。缺少相关部分(浏览按钮)。请注意,您的第二个屏幕截图表明您试图使用该元素进行上传,但您的第一条评论表明没有该元素。那是哪一个呢?嗨,JeffC,我理解你的观点,但我必须自动化这一点,我们有25种语言,需要自动化这个工作流程,以便我们可以检查所有错误验证消息是否正确翻译。如果手动点击,我们需要重复25次,并且必须手动截图。这就是我需要将其自动化的原因。谢谢,我不是说不要自动化。我是说不要使用Javascript来取消隐藏输入。编写场景脚本,就像用户与页面交互一样,您可能不会遇到这些问题。您询问您需要关注哪些事件,我的观点是,如果您不使用javascript等快捷方式设置UI,UI将为您触发所有正确的事件。嗨,JeffC,抱歉,我没有正确理解您的意思。我明白了,我需要像一个普通用户在自动化代码中所做的一样,然后这个问题可能会得到解决,我会试试这个,然后再给你回复。非常感谢您的帮助。您好,我试过了,这两个UI元素仍然不存在。我认为这比我预期的更复杂,手动单击admin_CHOOSE_FILE按钮,弹出依赖操作系统的文件选择器窗口,选择文件后,首先触发文件扩展名验证,如果文件不是以.xslx结尾,那么它将只显示错误消息,而不显示上载文件按钮,只有当我手动选择具有正确扩展名的文件时,它才会触发用户界面上的上载按钮的加载。如果没有可复制的示例,很难说为什么不能获得预期结果。找出这一点的最佳机会是调试页面中的事件以查看发生了什么。驱动程序在
上发出更改事件,因此如果它正在侦听,则应该由扩展验证来处理。