Tool for image-based control RDP (Remote Desktop Protocol). Manipulations, automations and testing via Python and Apache Guacamole
demo2.mp4
Installed and configured Apache Guacamole. I used this guacamole docker project: https://github.com/boschkundendienst/guacamole-docker-compose
pip install rdp-manipulations
see ./examples
folder. To run it, clone this repo, and:
poetry shell
poetry install
python examples/copy_and_zip.py
Only Windows 7 is currently supported because I only needed to work with Windows 7 PCs. If you need support for other OSes, use your ASSERT_DICT
, make a pull request, or write an issue. We'll figure something out.
Pass it to instance of RDP
for unsupported OS (see below)
{
'prelogin': './image_asserts/prelogin.png',
'login': './image_asserts/login.png',
'post_login': './image_asserts/post_login.png',
'start_btn': './image_asserts/start_btn.png',
'start_btn_selected': './image_asserts/start_btn_selected.png',
'run_window': './image_asserts/run_window.png',
'lang_ru': './image_asserts/lang_ru.png',
'lang_en': './image_asserts/lang_en.png',
'opened_folder': './image_asserts/opened_folder.png',
'files_copy': './image_asserts/files_copy.png',
}
class RDP()
RDP class
def __init__(headless=headless,
width=width,
height=height,
clear_logs=clear_logs,
assert_dict=ASSERT_DICT) -> None
Arguments:
headless
bool, optional - if False rdp window is shown. (default is True)width
int, optional - witdth of rdp window. Set it same in guacamole (default is 800)height
int, optional - witdth of rdp window. Set it same in guacamole (default is 600)clear_logs
bool, optional - if True old image logs will be removed when RDP class inited. (default is True)assert_dict
dict, optional - dict with assertion images. Pass it for unsupported OS (default isASSERT_DICT
)
def login(guacamole_user: str,
guacamole_password: str,
guacamole_pc_name: str,
guacamole_url=guacamole_url) -> None
Login method. Call this first
def key_press(keys: str)
This is wrapper of playwright keyboard.press method. see: https://playwright.dev/python/docs/api/class-keyboard#keyboard-press
def key_type(text: str)
Type text on remote pc
def make_screenshot(filename: Optional[str] = None,
path: Optional[str] = None) -> str
Make screenshot, and save it to default direcotry (./image_logs), or to given path
def is_on_screen(assertion: str, threshold: float = image_threshold) -> bool
Checking assertion image is on screen (assertion is a path to image)
def wait_until_appear(assertion: str,
attempts: int = screen_state_attempts,
threshold: float = image_threshold) -> None
Waiting until assertion image is appear on screen (assertion is a path to image)
def wait_until_desappear(assertion: str,
attempts: int = screen_state_attempts,
threshold: float = image_threshold) -> None
Waiting until assertion image is desappear on screen (assertion is a path to image)
def exec_remote(cmd_str: str) -> None
Execute remote command via win+r run window
def copydir(from_path: str, to_path: str) -> None
Copy folder on remote PC
def copy(from_path: str, to_path: str) -> None
Copy file on remote PC
def mkdir(dir_path: str) -> None
Making directory
def opendir(dir_path: str, local: bool = False) -> None
Open explorer.exe of given directory path
def closedir(dir_name: str) -> None
Close explorer.exe of given directory name
def mouse_click(x: float, y: float, click_count: int = 1) -> None
Mouse left click on remote PC by giving coordinates
def mouse_move(x: float, y: float) -> None
Mouse move on remote PC by giving coordinates
def mouse_move_to(assertion: str) -> Optional[tuple[float, float]]
Mouse move on remote PC by giving image assertion path
def mouse_click_to(
assertion: str,
button: Literal['left', 'middle', 'right'] = 'left') -> Optional[tuple[float, float]]
Mouse click on remote PC by giving image assertion path
def current_lang() -> Optional[str]
Get a current keuboard language (now support only 'en' and 'ru')
def lang_switch(lang: Optional[str] = None) -> Optional[str]
Switch keuboard language (now support only 'en' and 'ru')
def logout() -> None
Logout method