在 python 中使用 selenium 与 pop-up 盒子交互

Interacting with pop-up boxes using selenium in python

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

我正在分两部分处理脚本 - 1. 获取元数据和 2. 订购数据。我已成功完成第 1 部分中的脚本,除了最后一件事:选择保存刚刚生成的元数据文件。我把它留在了第 2 部分,希望我能偶然发现答案,但是当出现 pop-up 选择文件时,我遇到了同样的问题。

documentation 中,我被告知 Selenium WebDriver built-in 支持处理弹出对话框,并且在触发对话框后,如果我调用 alert = driver.switch_to_alert() 那么我可以 "accept, dismiss, read its contents, or even type into a prompt."

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

Selenium 无法识别我收到的弹出窗口(附上屏幕截图)吗?如果是这样,我如何与他们互动?好像用这个保存and/or上传文件是很多人必须做的事情,但我在Google上找不到任何东西。具体来说,我想为第一张图片选择 'Save File',然后选择 'OK',对于第二张图片,我想浏览到文件(即在文件名字段中输入路径)并单击 'Open.' 我不想只是将我的 Firefox 设置更改为自动保存,因为这最终会 运行 在不同的环境中,这无助于解决我的第二个问题。

谢谢!

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

您看到的弹出窗口不是可以使用 switch_to 进行交互的常规弹出窗口。这些弹出窗口是系统对话框并且无法使用selenium

自动执行

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

对于上传,通常您可以找到合适的输入元素并向其发送带有文件路径的密钥:

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


至于您的第一个 "download file automatically" 问题,您只需设置正确的内容类型:

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()

使用 AutoIT 实现极其简单。

下面的脚本和步骤可以帮助您点击 'Save>OK' 这个 window 的弹出窗口

第 1 步:在此处下载 AutoIT package/tool AutoIt 您可以 select 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 步:如果您的 OS 是 64 位,请单击 Aut2exe_x64.exe,否则单击 Aut2exe.exe

第 5 步:Browse/Locate 在第 2 步中创建的文件。 (文件保存为扩展名 .a3AND 选择目标 (.exe/.a3x) 和 select .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");