我正在尝试使用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来解决我的问题。
答案 0 :(得分:5)
您看到的弹出窗口不是可以使用switch_to
进行交互的常规弹出式窗口。这些弹出窗口是系统对话框,无法使用selenium
自动生成。
通常人们会通过调整浏览器偏好来避免首先显示这些对话框,例如:
对于上传,通常您可以找到相应的输入元素并使用文件路径向其发送密钥:
如果您使用我所附链接中的答案无法解决您的案例,请告诉我。功能
至于你的第一个“自动下载文件”问题,你只需要设置一个正确的内容类型:
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()
答案 1 :(得分:0)
使用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:浏览/查找在Step2中创建的文件。 (文件另存为扩展名 .a3 ) AND 选择目标(.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");