Задать вопрос
Seganapa
@Seganapa

Автоматизация Chromium Embedded Framework (cefpython)?

Всем доброго дня!

Возникла необходимость создать GUI со встроенным браузером.

Но просто встроить браузер мало, его еще нужно автоматизировать (произвести авторизацию и нажать пару кнопок)…


Сначала начал смотреть в сторону Selenium, авторизацию реализовал, нажатие кнопок реализовал, но вот встроить окошко с браузером в свое GUI приложение не получилось. Спрашивал у нескольких специалистов по Selenium, все в один голос сказали это невозможно.


Вторым этапом была настройка под себя и использование webkit. Тут обнаружилась другая проблема. Если заходить на сайт (меня интересует ru.grepolis.com) обычным браузером, происходит отправка ряда GET и POST запросов. Но если заходить на этот сайт через webkit, то на определенном этапе запросы перестают отправляться, т.е. получается что сайт не догружается… Сначала думал проблема с Flash, подключил плагин, попробовал youtube.com, все нормально грузится (ролики проигрывает), а вот нужный мне сайт никак не хочет до конца загружаться… Пробовал Spynner, но так как он написан с использованием webkit, та же самая история, сайт до конца не загружается…


И наконец, самый подходящий ИМХО мне вариант использование cefpython. Вставил браузер в свое GUI окошко, загрузил страницу, все полностью отобразилось, в общем работает как нужно… Но тут возник другой вопрос: КАК АВТОМАТИЗИРОВАТЬ ЗАПОЛНЕНИЕ ПОЛЕЙ И НАЖАТЬ КНОПКИ? Какими средствами это можно реализовать? Списывался с разрабом, он посоветовал использовать JavaScript. Но как реализовать я не пойму, в Java полный 0.


Помогите кто сталкивался, как решить мою проблему?

Приведу для примера код. Он открывает Google. Как автоматизировать, например, ввод текста в строку поиска?

# An example of embedding CEF in wxPython application.
#coding:utf-8

import wx
import sys
import time
import cefpython

# TODO: currently we use wx.Timer to imitate message loop, but
# it would probably be better to use wx.CallLater() and wx.lib.pubsub.

class MainFrame(wx.Frame):

	browser = None

	def __init__(self):
		
		wx.Frame.__init__(self, parent=None, id=wx.ID_ANY, title='wxPython example', size=(1000,800))
		self.CreateMenu()
		self.browser = cefpython.CreateBrowser(self.GetHandle(), browserSettings={}, navigateURL="http://google.com")		
		
		self.Bind(wx.EVT_SET_FOCUS, self.OnSetFocus)
		self.Bind(wx.EVT_SIZE, self.OnSize)
		
	def CreateMenu(self):

		filemenu = wx.Menu()
		filemenu.Append(1, "Открыть")
		filemenu.Append(2, "Выход")

		aboutmenu = wx.Menu()
		aboutmenu.Append(1, "CEF Python")

		menubar = wx.MenuBar()
		menubar.Append(filemenu,"&File")
		menubar.Append(aboutmenu, "&About")

		self.SetMenuBar(menubar)

	def OnSetFocus(self, event):

		cefpython.wm_SetFocus(self.GetHandle(), 0, 0, 0)

	def OnSize(self, event):

		cefpython.wm_Size(self.GetHandle(), 0, 0, 0)

class MyApp(wx.App):

	timer = None
	timerID = 1

	def OnInit(self):

		cefpython.Initialize()
		sys.excepthook = cefpython.ExceptHook

		self.timer = wx.Timer(self, self.timerID)
		self.timer.Start(10) # 10ms
		wx.EVT_TIMER(self, self.timerID, self.OnTimer)
		
		frame = MainFrame()
		self.SetTopWindow(frame)
		frame.Show()
		
		return True

	def OnExit(self):

		self.timer.Stop()
		cefpython.Shutdown()

	def OnTimer(self, event):

		cefpython.SingleMessageLoop()

if __name__ == '__main__':
	
	print('wx.version=%s' % wx.version())
	app = MyApp(False)
	app.MainLoop()



Может быть есть какой-нибудь другой способ реализовать мою затею… Подскажите пожалуйста. Второй месяц в тупике…
  • Вопрос задан
  • 7827 просмотров
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
@faddey0
Сам вот задаюсь такой же проблемой. С разрабом не связывался, но судя по всему, единственное решение до сих пор - это использование JavaScript. Самое простое решение для cefpython3 выглядит примерно так:

class MainFrame(wx.Frame):
    # ...

    def OnInit(self):
        # ...
        self.bind_js()
    
    def bind_js(self):
        js_code = """
        // write your js here
        """
        self.browser.SetClientCallback(
            'OnLoadEnd',
            lambda *args, **kwargs: self.execute_js(js_code),
        )
        
    def execute_js(self, code):
        self.browser.GetMailFrame().ExecuteJavascript(code)


Увы, найти способа привязаться к концу загрузки страницы не с помощью js я не нашел. Мб кто-нибудь подскажет?
Ответ написан
Комментировать
bndr
@bndr
На сайте греполиса подключен jQuery. Соотвтетсвенно автоматизация заполнения на Javascript будет выглядеть приверно так:
$(document).ready(function(){ $('#loginform #name').val('Мой логин'); $('#loginform #password').val('Мой пароль'); $('#loginform').submit(); });
Ответ написан
Seganapa
@Seganapa Автор вопроса
bndr как это применить к моему коду?
Ответ написан
@goblin2oo8
Чувак, если бы ты знал сколько я инфы перерыл по схожей задаче))
А ответ прост:
К cefpython цепляй - Selenium
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы