无法在酱汁实验室虚拟测试中通过酱汁存储将文件上传到移动网络应用程序

问题描述

当我尝试在saucelabs虚拟测试中将a.jpg文件上传到我的应用程序时,出现错误

使用driver.SendKey()将文件上传到ucelab VM计算机中的应用程序。我正在尝试找出正确的路径,以使用SendKeys从酱汁存储中获取jpg文件。请帮忙

代码

{
        IAllowsFileDetection allowsDetection = driver as IAllowsFileDetection;
                        if (allowsDetection != null)
                        {
                            allowsDetection.FileDetector = new LocalFileDetector();
                        }

                        driver.SendKeys(element,"sauce-storage:oldtraford.jpg");
 } 

错误: 测试失败并显示以下错误:OpenQA.Selenium.WebDriverException:未知错误:路径不是绝对的:sauce-storage:oldtraford.jpg(会话信息:chrome = 74.0.3729.185)(驱动程序信息:chromedriver = 74.0.3729.6(255758eccf3d244491b8a1317aa76e1ce10d57e9-refs /在OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)处的branch = heads / 3729 @ {#29}),platform = Linux 4.15.0-54-generic x86_64)(在OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String)在OpenQA.Selenium.Remote.Remote处的driverCommandToExecute,Dictionary 2 parameters) at OpenQA.Selenium.Appium.AppiumDriver 1.Execute(字符串driverCommandToExecute,Dictionary 2 parameters) at OpenQA.Selenium.Remote.RemoteWebDriver.InternalExecute(String driverCommandToExecute,Dictionary 2个参数)在OpenQA.Selenium.Remote处的(String commandToExecute,Dictionary`2个参数)。 BST10Web.Framework.UI.Helpers.UiElementHelpers.EnterText(IWebElement元素,字符串值

处的RemoteWebElement.SendKeys(字符串文本)

解决方法

使用调味料存储也无法做到这一点。在测试开始之前,只能访问酱汁存储,以调配要使用的机器(更改寄存器,安装应用程序等)

不能在测试执行期间访问存储,另请参见https://wiki.saucelabs.com/display/DOCS/Temporary+Storage+Methods

,

问题

仅出于将来请求者的利益,这就是为什么在远程控制的浏览器中上传文件很棘手的原因。

选择要通过网络表单上传的文件时,确实发生的事情是,您用要上传的文件的路径填写了文件输入的值。

就是说,您要告诉表单文件在硬盘上的位置,仅此而已。提交表单时,浏览器进入硬盘驱动器,找到文件,然后将其发送到服务器。

浏览器必须能够访问您要上传的文件。当您的浏览器与文件在同一台计算机或网络上运行时,这不是问题...但是远程浏览器在同一台计算机或网络上没有。就浏览器而言,您要上传的文件不存在,并且测试失败。

解决方案

您可以使用File Detectors在Selenium中解决此问题。

文件检测器只是您提供给Selenium驱动程序的一部分代码,它可以让您确定使用function App() { const [count,setCount] = useState(0); function incrementCount() { setCount((prevCount) => prevCount + 1); } function decrementCount() { setCount((prevCount) => prevCount - 1); } let items = []; for (let number = 0; number < 10; number++) { // <-- 0-index items.push( <Pagination.Item key={number} onClick={() => setCount(number)} // <-- enclose current number/index value active={number === count} // <-- compare to current count value > {number + 1} // <-- transform data to displayable value </Pagination.Item> ); } const paginationBasic = ( <div> <Pagination> <Pagination.Prev onClick={decrementCount} /> {items} <Pagination.Next onClick={incrementCount} /> </Pagination> </div> ); return ( <div> <p>Hello Stack</p> {paginationBasic} </div> ); } 方法发送的值是否是文件的路径。如果认为是,Selenium绑定将执行以下操作:

  1. 本地计算机上查找文件并将其压缩
  2. 将压缩文件发送到远程计算机上的临时目录
  3. 解压缩文件
  4. 获取文件在远程计算机上的位置,并将该位置传递给使用send_keys
  5. 输入的文件

因此,现在,文件与浏览器位于同一台计算机上,知道在哪里可以找到它。繁荣!您可以将文件上传到Web应用。

Sauce Labs的文档中有an example of File Detectors个可用于其服务。

精美文件检测器

由于文件检测器采用字符串并返回文件路径,因此您也可以使用它们使代码更具模块化和可重用性。

例如,如果您从多个测试中上载相同的电子表格,则可以创建一个文件检测器,如果它接收到字符串send_keys,则返回该电子表格路径。然后,如果工作表的位置发生变化,则只需在文件检测器中对其进行更新。

或者,如果您需要上传不同大小的图像,则可以编写一个文件检测器,该文件检测器将图像大小作为输入,使用imagemagick创建该大小的图像。