Selenium python与FileOpen窗口交互

时间:2015-12-10 09:25:24

标签: python selenium

从Selenium,我设法自动化我的网站任务。 但是我遇到了一个问题:我需要在提交表单之前将文件上传到我的网页。 将上传的文件写入其输入元素不是一个选项,因为它比这更复杂。 所以基本上我需要通过单击按钮启动FileUpload对话框,在那里发送sendKeys,然后单击Ok关闭它。 我想知道这是否甚至可以仅使用Selenium? 我在python中使用它(因此我无法访问Robot类)

  

我到目前为止尝试过:

element.click()
time.sleep(5)
alert = driver.switch_to.alert
alert.send_keys("path.to.myfile.txt")
alert.accept()

(没有任何反应 - 我的意思是,文件打开对话框工作正常,但它不会发送密钥)

  

我也尝试过:

alert = driver.switch_to.alert
buildu = ActionChains(driver).send_keys('path.to.my.file.txt')
buildu.perform()

(也没有用)

也许我看错了...... 也许警报不是一个好方法? 你有什么主意吗? 我宁愿不必使用AUTOIT(出于我自己的原因)

所以我的目标是点击链接元素(DONE),然后链接打开文件上传打开文件对话框(DONE),然后我需要能够在新窗口的唯一textBox中输入文本,并且单击“确定”按钮

修改 这是显示的“打开文件”对话框。

enter image description here

我想要做的就是将文件名直接发送到窗口(当对话框显示时,textBox会被聚焦,因此无需进行更多操作)。发送密钥(文本)后,我需要能够点击打开按钮

2 个答案:

答案 0 :(得分:0)

我不知道这是否仅限于Windows 10或在其他Windows版本中略有不同,但是您可以使用以下代码/想法。

  1. 使用win32com.client.Dispatch("WScript.Shell")
  2. 打开Windows Shell
  3. 发送Tab键以浏览打开的文件对话框
  4. 将绝对文件路径粘贴到对话框顶部,也粘贴到文件选择文本字段中,并在输入以下内容时发送Enter键 标签导航到“打开”按钮
  5. 每个动作之间至少睡眠1秒。否则Windows会阻止此动作。

    import win32com.client as comclt
    

    ...

        def handle_upload_file_dialog(self, file_path):
            sleep = 1
            windowsShell = comclt.Dispatch("WScript.Shell")
            time.sleep(sleep)
            windowsShell.SendKeys("{TAB}{TAB}{TAB}{TAB}{TAB}")
            time.sleep(sleep)
            windowsShell.SendKeys("{ENTER}")
            time.sleep(sleep)
            windowsShell.SendKeys(file_path)
            time.sleep(sleep)
            windowsShell.SendKeys("{TAB}{TAB}{TAB}{TAB}{TAB}")
            time.sleep(sleep)
            windowsShell.SendKeys(file_path)
            time.sleep(sleep)
            windowsShell.SendKeys("{TAB}{TAB}")
            time.sleep(sleep)
            windowsShell.SendKeys("{ENTER}")
    

    ...

答案 1 :(得分:-1)

您可以创建一个粘贴文件名的Java程序,然后按Enter键。我确实遇到了同样的问题。这就是我实施的方式:

package myaots_basic;
import java.io.*;
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;
import java.awt.event.KeyEvent;
public class trial {

public static void main(String[] args) throws AWTException {
    System.out.println("HELLO WORLD");
    StringSelection attach1 = new StringSelection ("C:\\My Office Documents\\Selinium projects\\Data\\attachment1.doc");
    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(attach1, null);
    Robot rb1 = new Robot();
    rb1.delay(3000);
    rb1.keyPress(KeyEvent.VK_CONTROL);
    rb1.keyPress(KeyEvent.VK_V);
    rb1.keyRelease(KeyEvent.VK_V);
    rb1.keyRelease(KeyEvent.VK_CONTROL);
    rb1.delay(500);
    rb1.keyPress(KeyEvent.VK_ENTER);    // press Enter
    rb1.keyRelease(KeyEvent.VK_ENTER);
}

}

将其命名为trial.jar。使这个类成为可执行文件。

然后在你的python代码中添加一个简单的步骤:     导入子流程     subprocess.call(“java -jar trial.jar”,shell = True)