Вы можете использовать Python для автоматизации веб-задач, используя pywebkitgtk .Это привязка Python для WebKitGtk, которая использует движок WebKit, тот же движок, что и Chrome.
Благодаря этому сообщению в блоге pywebkitgtk - Выполнить JavaScript из Python , я создал подклассwebkit.WebView
чтобы упростить эти задачи.
import gtk
import webkit
import json
class WebView(webkit.WebView):
def eval_script(self, script):
self.execute_script('oldtitle=document.title;document.title="!!!!";document.title=JSON.stringify(eval(' + json.dumps(script) + '));')
result = json.loads(self.get_main_frame().get_title())
self.execute_script('document.title=oldtitle;')
return result
def wait_for_load(self):
handle = None
def load_status_cb(view, frame):
if frame == view.get_main_frame():
self.disconnect(handle)
gtk.main_quit()
handle = self.connect('load-finished', load_status_cb)
gtk.main()
Я добавил функцию с именем eval_script
, которая похожа на execute_script
, но вы можете получить результаты функции в виде объектов Python.Вам просто нужно убедиться, что то, что вы оцениваете, является JSON-сериализуемым.
Кроме того, я добавил функцию wait_for_load
, которая довольно понятна.
Чтобы настроить пользовательский интерфейс,Сначала вы должны создать окно, прокручиваемое окно и веб-представление.
# window
window = gtk.Window()
window.set_default_size(800, 600)
# scroll view
scroll_view = gtk.ScrolledWindow()
scroll_view.props.hscrollbar_policy = gtk.POLICY_AUTOMATIC
scroll_view.props.vscrollbar_policy = gtk.POLICY_AUTOMATIC
# web view
web_view = WebView()
# events
window.connect('delete-event', lambda window, event: gtk.main_quit())
# show
scroll_view.add(web_view)
window.add(scroll_view)
window.show_all()
Затем вы можете начать автоматизировать вещи!Например, этот код загружает страницу входа в StackOverflow, нажимает кнопку входа в Facebook, вводит имя пользователя и пароль (в данном случае «тест»).Наконец, он показывает текст кнопки входа в систему.
# the script is here
web_view.open('http://www.stackoverflow.com/users/login')
web_view.wait_for_load()
web_view.execute_script('openid.signin("facebook")')
web_view.wait_for_load()
web_view.execute_script('document.querySelector("#email").value = "test"')
web_view.execute_script('document.querySelector("#pass").value = "test"')
print "Login's button text is:", web_view.eval_script('document.querySelector("#buttons input[type=\\"submit\\"]").value')
В моем случае интерфейс Facebook был на тайском языке, и я мог видеть текст кнопки входа в систему.
Кнопка входа в системутекст: เข้า สู่ ระบบ
Вы также можете сделать так, чтобы он действительно нажал кнопку отправки, просто вызвав click()
для этого элемента. (Примечание: click()
работает для элементов кнопки, а не для ссылок)
web_view.execute_script('document.querySelector("#buttons input[type=\\"submit\\"]").click()')
web_view.wait_for_load()
Вы заметите, что после завершения всех сценариев приложение закрывается без ожидания.
Если вы хотите, чтобы приложение работало после завершения всех скриптов, вам нужно добавить последнюю строку:
gtk.main()
Также, если вы удалите строку window.show_all()
ипоследняя gtk.main()
строка.Тогда ваше приложение будет работать без графического интерфейса. (Примечание: вам все еще нужен сервер отображения.)
В данный момент у нас пока нет хороших документов по pywebkitgtk, поэтому вам нужно взглянуть на документацию WebKitGtk вместо.Удачи.