我正在寻找一种使用Python以编程方式控制Mac上的浏览器(即Firefox或Safari或Chrome / -ium或Opera,但不是IE)的方法。
我需要的操作包括以下链接,检查页面中是否存在元素,以及提交表单。
您会推荐哪种解决方案?
答案 0 :(得分:7)
答案 1 :(得分:4)
另外,你可以阅读这个论坛页面(我知道,它已经过时了,但它似乎与你的问题非常相关): http://bytes.com/topic/python/answers/45528-python-client-side-browser-script-language
另外:http://docs.python.org/library/webbrowser.html
示例:
from browser import *
my_browser = Firefox(99, '/usr/lib/firefox/firefox-bin') my_browser.open_url('cnn.com')
在浏览器框架中加载cnn.com主页文档时,
open_url
返回。
答案 2 :(得分:2)
如果您 实际上需要浏览器,请尝试mechanize。
示例:
import re
import mechanize
br = mechanize.Browser()
br.open("http://www.example.com/")
# follow second link with element text matching regular expression
response1 = br.follow_link(text_regex=r"cheese\s*shop", nr=1)
assert br.viewing_html()
print br.title()
print response1.geturl()
print response1.info() # headers
print response1.read() # body
br.select_form(name="order")
# Browser passes through unknown attributes (including methods)
# to the selected HTMLForm.
br["cheeses"] = ["mozzarella", "caerphilly"] # (the method here is __setitem__)
# Submit current form. Browser calls .close() on the current response on
# navigation, so this closes response1
response2 = br.submit()
答案 3 :(得分:2)
可能有点限制,但py-appscript可能是从Python控制Applescript可用浏览器的最简单方法。
对于更复杂的事情,你可以使用PyObjC来实现几乎任何东西 - 例如,webkit2png是一个Python脚本,它使用WebKit加载页面,并保存它的图像。你需要对Objective-C和Cocoa / etc有一个很好的理解才能使用它(因为它只是将ObjC对象暴露给Python)
Screen-scaping可以以更低的复杂性实现您想要的目标。
答案 4 :(得分:2)
查看spynner Python模块。
Spynner是一个用于Python的有状态程序化Web浏览器模块。它基于PyQT和WebKit。它支持Javascript,AJAX以及WebKit能够处理的所有其他技术(Flash,SVG,...)。 Spynner利用了JQuery。一个功能强大的Javascript库,可以轻松实现与页面和事件模拟的交互。
使用Spynner,您可以模拟没有GUI的Web浏览器(虽然可以打开浏览窗口以进行调试),因此可以用它来实现爬虫或验收测试工具。
答案 5 :(得分:1)
可以通过OSAScript(a.k.a. AppleScript)控制几个Mac应用程序,可以通过osascript
命令发送。奥莱利有一个article on invoking osascript
from Python。我不能保证它完全符合你的要求,但这是一个起点。
答案 6 :(得分:1)
可能过于强大,但请查看Marionette来控制Firefox。有tutorial at readthedocs:
您首先开始Marionette-enabled firefox instance:
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.NETWORK"/>
<uses-permission android:name="android.permission.USE_CREDENTIALS"/>
<uses-permission android:name="android.permission.INTERNET"/>
然后你创建一个客户端:
firefox -marionette
导航f.ex.是通过
完成的client = Marionette('localhost', port=2828)
client.start_session()
答案 7 :(得分:0)
看看PyShell(PyXPCOM的扩展名)。
示例:
promptSvc = components.classes["@mozilla.org/embedcomp/prompt-service;1"].\
getService(Components.interfaces.nsIPromptService)
promptSvc.alert(None, 'Greeting...', "Hello from Python")
答案 8 :(得分:0)
结帐Mozmill https://github.com/mikeal/mozmill
Mozmill是适用于Firefox和Thunderbird等Mozilla应用的UI自动化框架。它既是插件又是Python命令行工具。插件提供了一个用于编写和运行JavaScript测试的IDE,Python包提供了一种从命令行运行测试的机制,并提供了一种测试重新启动应用程序的方法。
答案 9 :(得分:0)
您可以将selenium
库用于Python,这是一个简单的示例(以unittest
的形式):
#!/usr/bin/env python3
import unittest
from selenium import webdriver
class FooTest(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Firefox()
self.base_url = "http://example.com"
def is_text_present(self, text):
return str(text) in self.driver.page_source
def test_example(self):
self.driver.get(self.base_url + "/")
self.assertTrue(self.is_text_present("Example"))
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(FooTest)
result = unittest.TextTestRunner(verbosity=2).run(suite)