【问题标题】:How to Upload file from windows directory using selenium2library and Robot Framework如何使用 selenium2library 和 Robot Framework 从 windows 目录上传文件
【发布时间】:2016-09-08 01:37:16
【问题描述】:

有人可以帮助我如何使用 selenium2library 和机器人框架从 windows 目录上传文件。我尝试在 selenium2library 中使用选择文件命令,但由于本地文件系统中不存在文件而出现错误。我不确定是否不考虑目录路径或任何其他问题。请给我有效的代码或任何替代解决方案。任何帮助将不胜感激。以下是我尝试过的命令

Choose file     xpath = //input[@firmware-upgrade='firmware']       /Downloads/Cambium_Builds/Falcon/ePMP1000-Hotspot-2.5.1-b3.tar

HTML标签是`

`

【问题讨论】:

  • 使用此站点并自行尝试。但这使用的是 Auto IT 而不是机器人。这两种工具都用于处理基于窗口的弹出窗口。所以试试这个。祝你好运。 toolsqa.com/selenium-webdriver/autoit-selenium-webdriver
  • 您需要提供完整路径。
  • @FlorentB。给出完整路径后无法检测。尝试以下路径。选择文件 xpath = //input[@firmware-upgrade='firmware'] C:/Users/mra001/Downloads/Cambium_Builds/Falcon/ePMP1000-Hotspot-2.5.1-b3.tar
  • 您是否尝试过文件方案:file:///C:/Users/...
  • 您是否有理由不仅使用 selenium 上传这些文件?

标签: robotframework selenium2library


【解决方案1】:

感谢大家的回答和时间,但幸运的是,以下脚本帮助我从 Windows 上传文件并且工作正常。使用 AutoIT 执行相同操作可能有不同的选项,但我已经尝试了我所知道的一切。

***Settings***
Library  Selenium2Library


*** Variables ***
${Browser_Chrome}           Chrome
${Device_77_URL}        https://10.110.0.17
${Device_Path}          C:\\Users\\mra001\\Downloads\\Builds\\Gambit\\500-2.5.1-b3.img

*** Keywords ***


Software Update 
    Open Browser    ${Device_77_URL}    Chrome
    Input Text      id=Username  admin
    Input Text      password=Password    admin
    Click Button    xpath = //button[@type='submit']
    Wait Until Element Is Visible       //a[text()='Home']      20
    Click Link      xpath = //a[text()='Operations ']
    Input Text  xpath = //input[@firmware-upgrade='firmware']  ${Device_Path}
    Click Button        Upgrade Firmware
    Sleep       70
    Confirm Action
    Close Browser

【讨论】:

  • 与问题无关,但仍然:如果您将Sleep 70 更改为另一个Wait Until Element Is Visible,您可以节省一些时间。
  • @jim 我知道这与我提出的问题无关,但我已经尝试过 AutoIT 和其他选项,但这对我不起作用。我已经尝试过我所知道的任何事情。我将使用等到元素可见而不是睡眠..感谢您的评论
  • 谢谢。双反斜杠,什么鬼。因此搜索了几个小时。
【解决方案2】:

点击浏览按钮使用 Robot Framework 打开弹出窗口后,您可以执行以下操作来提交文件。

public static void robotwrite() throws Exception{
    try{
        RobotWrite rw = new RobotWrite();
        rw.type("C:\\Desktop\\Example.docx");
        Robot r = new Robot();
        r.keyPress(VK_ENTER);
        r.keyRelease(VK_ENTER);
    }catch (Exception e){
        Log.error("Could not write");
        throw(e);
    }
}

机器人类

import static java.awt.event.KeyEvent.*;
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;

public class RobotWrite {

    private Robot robot;

    public RobotWrite() throws AWTException {
        this.robot = new Robot();
    }



    public void type(CharSequence characters) throws AWTException {
        int length = characters.length();
        for (int i = 0; i < length; i++) {
            char character = characters.charAt(i);
            type(character);
        }
    }

    public void type(char character) throws AWTException {
        switch (character) {
        case 'a': doType(VK_A); break;
        case 'b': doType(VK_B); break;
        case 'c': doType(VK_C); break;
        case 'd': doType(VK_D); break;
        case 'e': doType(VK_E); break;
        case 'f': doType(VK_F); break;
        case 'g': doType(VK_G); break;
        case 'h': doType(VK_H); break;
        case 'i': doType(VK_I); break;
        case 'j': doType(VK_J); break;
        case 'k': doType(VK_K); break;
        case 'l': doType(VK_L); break;
        case 'm': doType(VK_M); break;
        case 'n': doType(VK_N); break;
        case 'o': doType(VK_O); break;
        case 'p': doType(VK_P); break;
        case 'q': doType(VK_Q); break;
        case 'r': doType(VK_R); break;
        case 's': doType(VK_S); break;
        case 't': doType(VK_T); break;
        case 'u': doType(VK_U); break;
        case 'v': doType(VK_V); break;
        case 'w': doType(VK_W); break;
        case 'x': doType(VK_X); break;
        case 'y': doType(VK_Y); break;
        case 'z': doType(VK_Z); break;
        case 'A': doType(VK_SHIFT, VK_A); break;
        case 'B': doType(VK_SHIFT, VK_B); break;
        case 'C': doType(VK_SHIFT, VK_C); break;
        case 'D': doType(VK_SHIFT, VK_D); break;
        case 'E': doType(VK_SHIFT, VK_E); break;
        case 'F': doType(VK_SHIFT, VK_F); break;
        case 'G': doType(VK_SHIFT, VK_G); break;
        case 'H': doType(VK_SHIFT, VK_H); break;
        case 'I': doType(VK_SHIFT, VK_I); break;
        case 'J': doType(VK_SHIFT, VK_J); break;
        case 'K': doType(VK_SHIFT, VK_K); break;
        case 'L': doType(VK_SHIFT, VK_L); break;
        case 'M': doType(VK_SHIFT, VK_M); break;
        case 'N': doType(VK_SHIFT, VK_N); break;
        case 'O': doType(VK_SHIFT, VK_O); break;
        case 'P': doType(VK_SHIFT, VK_P); break;
        case 'Q': doType(VK_SHIFT, VK_Q); break;
        case 'R': doType(VK_SHIFT, VK_R); break;
        case 'S': doType(VK_SHIFT, VK_S); break;
        case 'T': doType(VK_SHIFT, VK_T); break;
        case 'U': doType(VK_SHIFT, VK_U); break;
        case 'V': doType(VK_SHIFT, VK_V); break;
        case 'W': doType(VK_SHIFT, VK_W); break;
        case 'X': doType(VK_SHIFT, VK_X); break;
        case 'Y': doType(VK_SHIFT, VK_Y); break;
        case 'Z': doType(VK_SHIFT, VK_Z); break;
        case '`': doType(VK_BACK_QUOTE); break;
        case '0': doType(VK_0); break;
        case '1': doType(VK_1); break;
        case '2': doType(VK_2); break;
        case '3': doType(VK_3); break;
        case '4': doType(VK_4); break;
        case '5': doType(VK_5); break;
        case '6': doType(VK_6); break;
        case '7': doType(VK_7); break;
        case '8': doType(VK_8); break;
        case '9': doType(VK_9); break;
        case '-': doType(VK_MINUS); break;
        case '=': doType(VK_EQUALS); break;
        case '~': doType(VK_SHIFT, VK_BACK_QUOTE); break;
        case '!': doType(VK_EXCLAMATION_MARK); break;
        case '@': doType(VK_AT); break;
        case '#': doType(VK_NUMBER_SIGN); break;
        case '$': doType(VK_DOLLAR); break;
        case '%': doType(VK_SHIFT, VK_5); break;
        case '^': doType(VK_CIRCUMFLEX); break;
        case '&': doType(VK_AMPERSAND); break;
        case '*': doType(VK_ASTERISK); break;
        case '(': doType(VK_LEFT_PARENTHESIS); break;
        case ')': doType(VK_RIGHT_PARENTHESIS); break;
        case '_': robot.keyPress(KeyEvent.VK_SHIFT); robot.keyPress(KeyEvent.VK_MINUS); robot.keyRelease(KeyEvent.VK_SHIFT); break;
        case '+': doType(VK_PLUS); break;
        case '\t': doType(VK_TAB); break;
        case '\n': doType(VK_ENTER); break;
        case '[': doType(VK_OPEN_BRACKET); break;
        case ']': doType(VK_CLOSE_BRACKET); break;
        case '\\': doType(VK_BACK_SLASH); break;
        case '{': doType(VK_SHIFT, VK_OPEN_BRACKET); break;
        case '}': doType(VK_SHIFT, VK_CLOSE_BRACKET); break;
        case '|': doType(VK_SHIFT, VK_BACK_SLASH); break;
        case ';': doType(VK_SEMICOLON); break;
        case ':': robot.keyPress(KeyEvent.VK_SHIFT);
        robot.keyPress(KeyEvent.VK_SEMICOLON);
        robot.keyRelease(KeyEvent.VK_SEMICOLON);
        robot.keyRelease(KeyEvent.VK_SHIFT); break;
        case '\'': doType(VK_QUOTE); break;
        case '"': doType(VK_QUOTEDBL); break;
        case ',': doType(VK_COMMA); break;
        case '<': doType(VK_SHIFT, VK_COMMA); break;
        case '.': doType(VK_PERIOD); break;
        case '>': doType(VK_SHIFT, VK_PERIOD); break;
        case '/': doType(VK_SLASH); break;
        case '?': doType(VK_SHIFT, VK_SLASH); break;
        case ' ': doType(VK_SPACE); break;
        default:
            throw new IllegalArgumentException("Cannot type character " + character);
        }
    }

    private void doType(int... keyCodes) {
        doType(keyCodes, 0, keyCodes.length);
    }

    private void doType(int[] keyCodes, int offset, int length) {
        if (length == 0) {
            return;
        }

        robot.keyPress(keyCodes[offset]);
        doType(keyCodes, offset + 1, length - 1);
        robot.keyRelease(keyCodes[offset]);
    }
}

【讨论】:

    【解决方案3】:

    Selenium 提供了使用 send_keys() 方法上传文件的选项。我不知道您使用的是什么语言,所以我将提供一个 Python 示例。

    在屏幕截图中,我可以看到这是您的输入元素:

    <input type="file" firmware-upgrade="firmware"/>
    

    假设您已找到该元素并保存在元素变量中。 如果我们想将文件上传到这里,我们需要做的就是使用 send_keys() 方法并将文件路径作为参数。

    element = function_to_locate_element()
    element.send_keys('path\\to\\file')
    

    这样就不需要使用机器人了。

    【讨论】:

    • 您建议他切换框架,而不是为作者的极其简单的问题提供解决方案(这就是 Florent 所做的顺便说一句:stackoverflow.com/questions/37183182/…)。这到底有什么帮助?
    • 他已经在使用 selenium。他想要进行文件上传并为此使用机器人框架(很可能是因为 selenium 无法处理操作系统级别的对话框)。我的建议是他可能想利用 selenium 附带的上传功能,而不是为此使用机器人。
    • 这不是 RF 的工作方式,您不要将它包含在 selenium 中。 RF 本身利用硒作为底层驱动程序之一。如果您知道什么是 Robot Framework 以及它的实际工作原理,您就不会犯这个错误。
    • 这可能是真的,我可能犯了一个错误。但是,我确实认为如果提问者没有使用此问题,则不应将问题标记为“硒”。 selenium2library 就足够了。
    • 你很可能是正确的。我也想为我不恰当的严厉道歉。
    猜你喜欢
    • 2018-01-29
    • 2015-08-12
    • 1970-01-01
    • 2018-09-08
    • 2019-11-12
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    相关资源
    最近更新 更多