【问题标题】:Interacting with pop-up boxes using selenium in python在 python 中使用 selenium 与弹出框交互
【发布时间】:2015-03-03 13:13:45
【问题描述】:

我正在尝试使用 python 中的 Selenium 模块从一个网站生成一个文本列表,将其保存在一个目录中,然后浏览到另一个网站上的该文本列表以提交它。

我正在分两部分编写脚本 - 1. 获取元数据和 2. 订购数据。我已经成功完成了第 1 部分中的脚本,除了最后一件事:选择保存刚刚生成的元数据文件。我将其单独留在第 2 部分,希望我能偶然找到答案,但当弹出选择文件出现时,我只是遇到了同样的问题。

documentation 中,我被告知 Selenium WebDriver 内置了对处理弹出对话框的支持,并且在触发对话框后,如果我调用 alert = driver.switch_to_alert() 然后我可以“接受、关闭、阅读它内容,甚至输入提示。”

但是,它不起作用。当我尝试alert.text('some text')alert.send_keys(Keys.TAB) 时,我不断收到错误NoAlertPresentException: Message: No alert is present,添加等待命令后,我收到错误TimeoutException: Message:

Selenium 无法识别我收到的弹出窗口(附有屏幕截图)吗?如果是这样,我该如何与他们互动?似乎使用它来保存和/或上传文件是很多人必须做的事情,但我在谷歌上找不到任何东西。具体来说,我想为第一个图像选择“保存文件”,然后选择“确定”,第二个我想浏览到文件(即在文件名字段中输入路径)并单击“打开”。我不想只是将我的 Firefox 设置更改为自动保存,因为这最终会在不同的环境中运行,这无助于解决我的第二个问题。

谢谢!

编辑: 我正在 Windows 上测试我的脚本,但它最终将在 linux 云服务器上实现。我以为我将不得不切换到 PhantomJS webdriver(这可能会使我的问题变得更糟)来进行无头浏览,但我找到了一种保留 firefox 的方法。我想这一切意味着我无法使用 AutoIT 来解决我的问题。

【问题讨论】:

  • driver.switchto.alert(在 Java 中)我们用于 JavaScript 对话框。它们是警报框、构象框和弹出框。但是您看到的对话框不属于上述任何一种,因此您无法使用 Alert 处理。有关警报的详细说明,您可以观看视频youtube.com/watch?v=3T0YaroB2fk。您可能需要尝试 AutoIT 等来解决您的问题。
  • 你可以在java中尝试类似Robot类的东西。

标签: python selenium selenium-webdriver


【解决方案1】:

您看到的弹出窗口不是可以使用switch_to 进行交互的常规弹出窗口。这些弹出窗口是系统对话框不能使用selenium自动实现。

通常人们会通过调整浏览器偏好来避免首先显示这些对话框,例如:

对于上传,通常您可以找到适当的输入元素并将密钥与文件路径一起发送给它:

如果您的案例无法通过我所附链接中的答案解决,请告诉我。


至于你的第一个“自动下载文件”的问题,你只需要设置一个正确的content-type:

profile.set_preference('browser.helperApps.neverAsk.saveToDisk', "application/xml,text/xml")

第二个问题修复(上传部分):

driver.find_element_by_name("input_product_list").send_keys(textpath)
driver.find_element_by_name('include_sr').click()
driver.find_element_by_id('submit').click()

【讨论】:

  • 嗨,alec,感谢您的回复。我已经查看了我能找到的每一个 selenium/upload files 线程,但仍然没有解决方案。我去了所有三个链接重新调整浏览器首选项,但它们都不适合我——打开/保存文件的弹出框仍然出现。对于上传,我尝试找到输入元素,以各种可能的方式单击和发送键,但这也不起作用。我认为原因是,如果您转到我链接的第二个网站,您会看到文件路径没有文本框。您只能通过单击浏览打开文件并...
  • ...在此处输入路径名/以交互方式浏览文件。那么既然 selenium 无法与这些 OS 对话框交互,那么还有其他模块可以吗?或者解决这个问题的另一个黑客?请注意,我添加了一个描述如何在 linux 中实现的编辑,所以我不能使用 autoIT。从字面上看,这是我做过的最令人沮丧的事情,因为如果不是因为这个问题,我已经接近完成了。呃。
  • @user20408 我们会解决的,别担心。让我们一步一步来。对于初学者,让我们开始下载部分——你能展示你点击下载metadata.xml文件按钮的代码吗——这样我就可以测试它了吗?谢谢。
  • 感谢 alec,非常感谢您愿意提供帮助。以您的方式发送脚本对我来说会更好吗?我该怎么做呢?我没有足够的代表在这里做很多事情。谢谢。
  • @user20408 只需编辑问题并将其包含在其中。如果它很大,请创建一个要点并在此处发布链接。谢谢。
【解决方案2】:

使用 AutoIT 实现极其简单。

下面的脚本和步骤可以让您在此窗口的弹出窗口中单击“保存>确定”

第 1 步:在此处下载 AutoIT 包/工具AutoIt 您可以选择 ZIP 格式(解压)

第 2 步:打开任何文本编辑器(例如记事本)并复制以下代码并使用扩展名 .au3
(例如 file.au3)保存

WinWait("[TITLE:Opening ; CLASS:MozillaDialogClass]","", 10)
If WinExists("[TITLE:Opening ; CLASS:MozillaDialogClass]") Then
WinActivate("[TITLE:Opening ; CLASS:MozillaDialogClass]")
Send("{DOWN}")
Sleep(20)
Send("{TAB}")
Sleep(20)
Send("{TAB}")
Sleep(20)
Send("{ENTER}")
EndIf

第 3 步:从解压缩的 zip (第 1 步) 查找名为:Aut2Exe 的文件夹并打开它

第 4 步:如果您的操作系统是 64 位,请点击 Aut2exe_x64.exe,否则点击 Aut2exe.exe

第 5 步:浏览/定位在第 2 步中创建的文件。 (文件保存为扩展名.a3AND 选择 Destination (.exe/.a3x) 并选择 .exe 选项 (比如 file.exe) 然后点击转换

第 6 步:将这个 file.exe 包含在您的项目文件夹中,并使用以下代码根据您的要求使用它(就像在 Eclipse 中一样):

driver.dwonload().click(); // it can be something else as per your flow
Runtime.getRuntime().exec("C:/*path_to_your_EXE_file(selected in step 6))*/file.exe");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    相关资源
    最近更新 更多