Source code for rpyc_docker.browser

#browser.py
#part of docker_rpyc
from selenium import webdriver
from pyvirtualdisplay import Display
import os.path,os,datetime,logging

logger = logging.getLogger("rpyc_docker")
logger.setLevel(logging.INFO)

[docs]class Browser(object): def __init__(self): self.display = None self.driver = None self.start = datetime.datetime.now().strftime("%b-%d-%Y-%H:%M:%S")
[docs] def driver_chrome(self): self.driver = webdriver.Chrome(executable_path='/usr/lib/chromium-browser/chromedriver') return "chrome"
[docs] def driver_firefox(self): self.driver = webdriver.Firefox() return "firefox"
[docs] def patch_pydisplay(self): """ monkey patch xvnc to use password file if using xvnc backend call this function before calling setup """ from pyvirtualdisplay.xvnc import XvncDisplay import pexpect child = pexpect.spawn('vncpasswd') child.expect('Password:') child.sendline('secret') child.expect('Verify:') child.sendline('secret') @property def _cmd(self): cmd = ['Xvnc', '-depth', str(self.color_depth), '-geometry', '%dx%d' % (self.size[0], self.size[1]), '-rfbport', str(self.rfbport), '-rfbauth', '/root/.vnc/passwd', self.new_display_var, ] return cmd XvncDisplay._cmd = _cmd
[docs] def setup(self,visible = False, driver = "firefox", backend = 'xvfb', opt = None): """ Sets up the webbrowser :param visible: if True, visible if False runs as headless :param driver: either "firefox" or "chrome" or a an instance of rpyc_docker.drivers.WebDriver :param backend: either "xvfb" or xvnc" if xvnc then it will start and xvnc server which can be connected to. Default password is secret. :param opt: not used :type visible: bool :type driver: str or rpyc_docker.drivers.WebDriver :type backend: str :type opt: None :return: True if successful :rtype: bool """ if backend == "xvnc" : self.patch_pydisplay() if not visible : if backend == 'xvfb': self.display = Display(backend=backend) else : self.display = Display(backend=backend,rfbport = 5900) self.display.start() try: self.driver = driver() return True except TypeError: try: getattr(self,"driver_%s" % (driver,))() return True except AttributeError: self.teardown() return False
[docs] def teardown(self): """ tears down the webbrowser """ if self.driver : self.driver.quit() self.driver = None if self.display : self.display.stop() self.display = None return True
[docs] def js_ex(self,script,*args): """ convenience function to execute javascript. :param script: The JavaScript to execute. :param *args: Any applicable arguments for your JavaScript. """ return self.driver.execute_script(script,*args)
[docs] def js_ex_file(self,fileName): with file(fileName,"r") as f : script = f.read() return self.driver.execute_script(script)
[docs] def get_attributes(self,element): """gets all of the attributes of a selenium web element""" return self.driver.execute_script(""" var items = {}; for (index = 0; index < arguments[0].attributes.length; ++index) { items[arguments[0].attributes[index].name] = arguments[0].attributes[index].value }; return items;""", element)
[docs] def get_element_image(self,element): """takes screenshot of an element returns it as a PIL image on IPython notebook the PIL image will be automatically displayed. Requires that PIL or Pillows is installed """ from PIL import Image from StringIO import StringIO location = element.location size = element.size img = Image.open(StringIO(self.driver.get_screenshot_as_png())) left = int(location['x']) top = int(location['y']) right = int(location['x'] + size['width']) bottom = int(location['y'] + size['height']) img = img.crop((left, top, right, bottom)) return img