在Mac上使用Python控制浏览器

时间:2010-04-18 04:29:24

标签: python firefox browser automation safari

我正在寻找一种使用Python以编程方式控制Mac上的浏览器(即Firefox或Safari或Chrome / -ium或Opera,但不是IE)的方法。

我需要的操作包括以下链接,检查页面中是否存在元素,以及提交表单。

您会推荐哪种解决方案?

10 个答案:

答案 0 :(得分:7)

我喜欢Selenium,它可以通过Python编写脚本。 Selenium IDE仅在Firefox中运行,但Selenium RC支持多种浏览器。

答案 1 :(得分:4)

查看python-browsercontrol

另外,你可以阅读这个论坛页面(我知道,它已经过时了,但它似乎与你的问题非常相关): 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浏览器(虽然可以打开浏览窗口以进行调试),因此可以用它来实现爬虫或验收测试工具。

请参阅some examples at GitHub page

答案 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")

Python PyShell 0.1, Mozilla, popup, OK

答案 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)