python+selenium+firefox与js友好交互设计

背景

selenium提供的webdriver,本身是可以通过execute_scriptexecute_async_script与js进行交互的,只是不太好控制,我们的目的是在网页中加入一个友好的界面,让他们之间更好的交互。

实验环境

win7 64位、python 3.6.4、selenium 3.13.0、firefox 49.0.2

设计思路

消息传递,通过一个全局js变量(代码中为window.messageQueue),把它模拟成一个队列,网页端通过js向队列中push数据,selenium端动态执行js从队列中pop取数据。
核心步骤如下:
1. 页面加载完后,动态注入jQuery(个人比较喜欢,用它操作起来方便)
2. jQuery加载完成后,在网页右下角创建一个控制面板,初始化发送消息相关逻辑
3. 点击控制面板中的按钮,但会向消息队列中写入数据
4. selenium定期检测消息队列,一有数据,便取出来处理

测试代码

from selenium import webdriver
import time

def loadScriptCode(url):
    """
    动态加载js的代码
    :param url: js url
    :return:
    """
    return '''
var el = document.createElement("script");
el.src = "{0}";
document.body.appendChild(el);
'''.format(url)

def initCode():
    """
    初始化相关的js代码(控制面板创建,消息发送相关)
    :return:
    """
    return '''
$(function(){
    console = window.console || {
        log: function(){}
    };
    console.log('init code...');
    var html = '';
    html += '
'; html += '
'; html += '
'; html += '
'; html += '
'; $('body').append(html); window.messageQueue = []; $('.controlPanel button').click(function(){ var cmd = $(this).attr('data-cmd'); var time = new Date().getTime(); window.messageQueue.push({cmd: cmd, time: time}); }); }); '''
def fetchMessageCode(): """ 取消息js代码 :return: """ return ''' if (window.messageQueue == null) { return null; } return window.messageQueue.pop(); ''' location = 'D:/Program Files/Mozilla Firefox/firefox.exe' driver = webdriver.Firefox(firefox_binary=location) url = 'https://www.xiaoying.com/user/login' driver.get(url) url = 'https://apps.bdimg.com/libs/jquery/1.9.1/jquery.min.js' driver.execute_script(loadScriptCode(url)) jQueryLoaded = False while True: jQueryLoaded = driver.execute_script('return window.jQuery != null;') if jQueryLoaded: print('jquery loaded, init code...') driver.execute_script(initCode()) break time.sleep(0.1) # 循环,定期去取消息,有取到就处理 while True: msg = driver.execute_script(fetchMessageCode()) if msg is not None: print('receive message:', msg) # 消息处理 cmd = msg['cmd'] if cmd == 'print-cookie': print(driver.get_cookies()) elif cmd == 'print-url': print(driver.current_url) elif cmd == 'quit-driver': print('bye bye') driver.quit() break time.sleep(0.1)

你可能感兴趣的:(技术研究相关,selenium,js交互,python,firefox)