我是一个大型 GUI 应用程序的开发人员,我们有一个用于错误跟踪的网站。任何人都可以向错误跟踪站点提交新错误。我们可以从桌面应用程序中检测到某些故障(即未处理的异常),在这种情况下,我们希望在用户预定义的浏览器中打开提交新错误表单,将我们可以收集到的有关故障的任何信息添加到某种表单中领域。我们可以使用 GET 或 POST http 方法检索提交新错误表单,并且可以为该表单提供默认字段值。所以从 http 服务器端来看一切都很好。
webbrowser
模块成功打开一个 URL,并在 URL 中传递默认值作为 GET 参数。但是,此方法存在一些限制,例如某些浏览器(特别是 MS IE)允许的 URL 最大长度。 webbrowser
模块似乎没有办法使用 POST 请求 URL。 OTOH 有 urllib2
模块 提供了我们想要的控件类型,但据我所知,它无法在用户首选浏览器中打开检索到的页面。
urllib2
的高级功能来精细控制webbrowser
)?
urllib2
检索 URL、将其内容保存到临时文件并使用 webbrowser
打开该文件的可能性。这是一个有点令人讨厌的解决方案,在这种情况下,我们将不得不处理其他问题,例如相对 URL。有更好的解决办法吗?
这不是正确的答案。但它也有效
import requests
import webbrowser
url = "https://www.facebook.com/login/device-based/regular/login/?login_attempt=1&lwv=110"
myInput = {'email':'[email protected]','pass':'mypaass'}
x = requests.post(url, data = myInput)
y = x.text
f = open("home.html", "a")
f.write(y)
f.close()
webbrowser.open('file:///root/python/home.html')
我不知道有什么方法可以在网络浏览器中打开 POST 请求的结果,而无需将结果保存到文件并打开该文件。
采取替代方法并将数据临时存储在服务器上怎么样?然后可以使用简单的 id 参数在浏览器中打开页面,并显示保存的部分填写的表单。
tempfile.NamedTemporaryFile()
:
import tempfile
import webbrowser
import jinja2
t = jinja2.Template('hello {{ name }}!') # you could load template from a file
f = tempfile.NamedTemporaryFile() # deleted when goes out of scope (closed)
f.write(t.render(name='abc'))
f.flush()
webbrowser.open_new_tab(f.name) # returns immediately
如果服务器可以轻松修改,更好的方法是使用
POST
发出带有部分参数的 urllib2
请求,并使用 webbrowser
打开服务器生成的 url,如@Acorn建议的 。
如果使用
selenium
,可以注入脚本来写入从响应生成的 HTML 页面,而不是写入文件:
response = requests.post('https://xxx', data = ...)
response_html = response.text
driver.get("about:blank")
driver.execute_script("document.write(arguments[0])", response_html)