Skip to content

Python library to interact with a Virtualbox instance using simple computer vision

License

Notifications You must be signed in to change notification settings

jacopofar/virtualbox-helper

Repository files navigation

Virtualbox helper

This library helps to automate UI tasks on a Virtualbox machine using OpenCV.

It's based on remotevbox to interact with the SOAP service and OpenCV to perform region detection.

Features:

  • can start the vboxwebsrv SOAP server programmatically and shut it down
  • match a region of the screen with a given fragment
  • wait for a fragment and click on its center
  • store if required a representation of the area it matched
  • accepts images as NumPy ndarray, raw bytes of filesystem paths

Installation

python3 -m pip install virtualbox_helper

Example usage

from virtualbox_helper import (
    ensure_server_running,
    get_machine,
    wait_for_fragment,
    wait_click_on_fragment,
)

# this starts the server and stops it when the interpreter exits
# or you can use the command vboxwebsrv manually
ensure_server_running()

machine = get_machine('vbox', 'yourpassphrase', 'Debian testing')
machine.launch()

no_match = detect_fragment(screenshot_data, 'some/random_image.png')
assert no_match is None

detection = detect_fragment(screenshot_data, 'valid_element.png')
assert detection is not None
# similarity score
assert detection[0] > 0.9
# coordinates of the bounding box that was detected
assert detection[1] == (19, 59)
assert detection[2] == (172, 114)

# raw bytes or a numpy (X, Y, 3) matrix can be used instead of a file path
button_data = open('button.png', 'rb').read()
target = wait_click_on_fragment(machine, button_data, timeout=60.0)
# target has the same structure of match above

wait_for_fragment(machine, 'some/element/to/wait_for.png')

with open('screenshot.png', 'wb') as f:
    screenshot_data = machine.take_screenshot_to_bytes()
    f.write(screenshot_data)

# this functionality is part of remotevbox
machine.send_character_string('hello world')
machine.send_key_combination(['<enter>'])

# this returns immediately, None if not found
# store_match indicates where to store the screenshot with the match
# highlighted as a red rectangle
detection = detect_fragment(
        machine.take_screenshot_to_bytes(),
        'expected_element.png',
        store_match='highlight_match.png'
        )

machine.poweroff()

When shoulkd I use this?

Hopefully never! If you have a proper API for what you want to automate, go with that. To automate UI operations look into PyAutoGUI, and Selenium or Puppeteer for the web.

However, if you can't do that, for example if you are writing tests for TempleOS or something weird, then this may be fine.

Tests

The tests are based on pytest, can be run using poetry run test. They expect a machine called "Debian testing" running Debian 11. Should be trivial to adapt to some other image.

About

Python library to interact with a Virtualbox instance using simple computer vision

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages