如何使用WebdriverIO上传文件

时间:2017-09-26 14:56:38

标签: node.js selenium-webdriver webdriver webdriver-io

我尝试使用selenium-webdriver gem将以下代码从使用WebdriverIO移植到Node.js:

@webdriver.navigate.to "https://imgur.com/upload"
element = @webdriver.find_element(:id, 'global-files-button')
element.send_keys("C:\\test\\image.png")

正如您所看到的,代码非常简单:导航到URL,找到输入,设置文件路径,并按预期工作,选择要上载的文件。

这是我的移植版本:

describe('User can upload', () => {
  it('select file', () => {
    browser.url("https://imgur.com/upload");
    browser.waitForExist('#global-files-button');
    $('#global-files-button').keys("C : \\ t e s t \\ i m a g e . p n g".split(" "));
  });
});

不幸的是,这个测试并没有设置路径,我还没有找到一个使用wdio上传这样一个文件的工作示例,文档让我猜测。任何建议非常感谢。

我知道chooseFile和uploadFile,但我正在使用云平台运行我的wdio测试,而且他们似乎无法可靠地工作。

2 个答案:

答案 0 :(得分:4)

我遇到了麻烦。根据我的研究,它不是WebdriverIO的问题,也不是selectFile()或uploadFile()方法。我认为问题的根源归结为Selenium Webdriver无法处理'多个' <input type='file' multiple>上传元素的错误。

我在这个github问题上磕磕绊绊了3天才打了一场比赛: https://github.com/SeleniumHQ/selenium-google-code-issue-archive/issues/2239

长话短说,因为imgur上的HTML上有“多个”属性,你的上传测试将无法正常工作。 WebdriverIO / Selenium从我注意到的东西中停止运作。

注意:我已经能够让我的应用程序上传单个文件,并在测试<input type='file' multiple>时将文件添加到我的系统和应用程序中。但问题是,WebdriverIO和Selenium刚刚停止。测试结束,不报告任何成功或失败结果。

如果您在网络上的某个地方测试另一个未被指定为“multiple”上传输入字段的<input type=file>元素,您应该可以从中创建chooseFile()方法WebdriverIO功能正常。

我希望这可以帮助您,也许还有其他任何一个在文件上传方面都很困难的人。

编辑: 我试图让你的例子工作,我成功地使用“chooseFile()”并直接将“filepath”传递给它。也许你正在尝试发送键盘命令,而你真的不需要?您是否有直接文件路径指向您尝试上传的图片?以下是我能够用来成功上传文件的内容。

it('upload a file to imgur', function () {
    browser.url("https://imgur.com/upload");
    browser.waitForExist('#global-files-button');
    browser.chooseFile('#global-files-button', '/insert/path/to/image.png')
}) 

答案 1 :(得分:1)

// c:/test/image.png
var test1 = 'c:/test/image.png'
var path = test1.split('/').join('\\\\')
browser.addValue('[name="fileField"]', path )

或者也许这也有效

// c:\test\image.png
var path = 'c:\\test\\image.png'
browser.addValue('[name="fileField"]', path )

或者这个

// c:/test/image.png
var path = 'c:/test/image.png'
browser.addValue('[name="fileField"]', path )