Best Python code snippet using playwright-python
__main__.py
Source:__main__.py
1#!/usr/bin/env python32import logging3import argparse4import enum5import os6import os.path7import sqlite38import signal9from time import sleep, time, ctime10from random import randrange, random11import collections12from heapq import merge13from selenium import webdriver14from selenium.webdriver.chrome.options import Options15from selenium.webdriver.common.by import By16from selenium.webdriver.common.action_chains import ActionChains17from selenium.webdriver.support.ui import WebDriverWait18from selenium.webdriver.support import expected_conditions as EC19from selenium.common.exceptions import (TimeoutException,20 StaleElementReferenceException,21 NoSuchElementException,22 ElementClickInterceptedException)23from webdriver_manager.chrome import ChromeDriverManager24from webdriver_manager.utils import ChromeType25RESUME_LIST_URL = "https://account.rabota.ua/jobsearch/notepad/cvs"26RESUME_LIST_URL_PATTERN = r"^https://account\.rabota\.ua/(ua/)?jobsearch/notepad/cvs/?$"27LOGIN_URL = "https://rabota.ua/jobsearch/login"28POST_LOGIN_URL_PATTERN = r"^https://account\.rabota\.ua/(ua/)?jobsearch/notepad/vacancies_profile/?$"29UPDATE_BUTTON_XPATH = "//div[contains(@class, 'cv-item-container')]"\30 "//button[contains(@data-bind, 'updateDate') and "\31 "(contains(text(), 'ÐбновиÑÑ') or contains(text(), 'ÐновиÑи'))]"32UPDATE_INTERVAL = 30 * 6033UPDATE_INTERVAL_MIN_DRIFT = 1034UPDATE_INTERVAL_MAX_DRIFT = 6035MANUAL_LOGIN_TIMEOUT = 360036POST_UPDATE_PAUSE = 3037DB_INIT = [38 "CREATE TABLE IF NOT EXISTS update_ts (\n"39 "name TEXT PRIMARY KEY,\n"40 "value REAL NOT NULL DEFAULT 0)\n"41]42def wall_clock_wait(when, precision=1.):43 """ Sleep variation which is doesn't increases44 sleep duration when computer enters suspend/hybernation45 """46 while time() < when:47 sleep(precision)48def setup_logger(name, verbosity):49 logger = logging.getLogger(name)50 logger.setLevel(verbosity)51 handler = logging.StreamHandler()52 handler.setLevel(verbosity)53 handler.setFormatter(logging.Formatter("%(asctime)s "54 "%(levelname)-8s "55 "%(name)s: %(message)s",56 "%Y-%m-%d %H:%M:%S"))57 logger.addHandler(handler)58 return logger59class LogLevel(enum.IntEnum):60 debug = logging.DEBUG61 info = logging.INFO62 warn = logging.WARN63 error = logging.ERROR64 fatal = logging.FATAL65 crit = logging.CRITICAL66 def __str__(self):67 return self.name68class Command(enum.Enum):69 login = 170 update = 271 def __str__(self):72 return self.name73class BrowserType(enum.Enum):74 chrome = ChromeType.GOOGLE75 chromium = ChromeType.CHROMIUM76 def __str__(self):77 return self.name78class ScheduledEvent(enum.Enum):79 REFRESH = 180 UPDATE = 281ScheduleEntry = collections.namedtuple('ScheduleEntry', ('when', 'what'))82button_wait_condition = EC.presence_of_element_located((By.XPATH, UPDATE_BUTTON_XPATH))83def update(browser, timeout):84 logger = logging.getLogger("UPDATE")85 browser.get(RESUME_LIST_URL)86 WebDriverWait(browser, timeout).until(87 button_wait_condition88 )89 update_buttons = browser.find_elements_by_xpath(UPDATE_BUTTON_XPATH)90 logger.info("Located %d update buttons", len(update_buttons))91 for elem in update_buttons:92 sleep(1 + 2 * random())93 elem.click()94 logger.debug("click!")95 # There is no easy reliable way to make sure all outstanding request are96 # complete. So, just give it enough time.97 sleep(POST_UPDATE_PAUSE)98 logger.info('Updated!')99def login(browser, timeout):100 logger = logging.getLogger("LOGIN")101 browser.get(LOGIN_URL)102 WebDriverWait(browser, timeout).until(103 EC.url_matches(POST_LOGIN_URL_PATTERN)104 )105 logger.info('Successfully logged in!')106def parse_args():107 def check_loglevel(arg):108 try:109 return LogLevel[arg]110 except (IndexError, KeyError):111 raise argparse.ArgumentTypeError("%s is not valid loglevel" % (repr(arg),))112 def check_command(arg):113 try:114 return Command[arg]115 except (IndexError, KeyError):116 raise argparse.ArgumentTypeError("%s is not valid command" % (repr(arg),))117 def check_browser_type(arg):118 try:119 return BrowserType[arg]120 except (IndexError, KeyError):121 raise argparse.ArgumentTypeError("%s is not valid browser type" % (repr(arg),))122 def check_positive_float(arg):123 def fail():124 raise argparse.ArgumentTypeError("%s is not valid positive float" % (repr(arg),))125 try:126 fvalue = float(arg)127 except ValueError:128 fail()129 if fvalue <= 0:130 fail()131 return fvalue132 parser = argparse.ArgumentParser(133 description="Python script to update your CV",134 formatter_class=argparse.ArgumentDefaultsHelpFormatter)135 parser.add_argument("-t", "--timeout",136 help="webdriver wait timeout",137 type=check_positive_float,138 default=10.)139 parser.add_argument("-b", "--browser",140 help="browser type",141 type=check_browser_type,142 choices=BrowserType,143 default=BrowserType.chromium)144 parser.add_argument("-v", "--verbosity",145 help="logging verbosity",146 type=check_loglevel,147 choices=LogLevel,148 default=LogLevel.info)149 parser.add_argument("cmd", help="command",150 type=check_command,151 choices=Command)152 parser.add_argument("-d", "--data-dir",153 default=os.path.join(os.path.expanduser("~"),154 '.config',155 'rabotaua-cv-updater'),156 help="application datadir location",157 metavar="FILE")158 return parser.parse_args()159class BrowserFactory:160 def __init__(self, profile_dir, browser_type, headless=True):161 chrome_options = Options()162 # option below causes webdriver process remaining in memory163 # chrome_options.add_argument('--no-sandbox')164 chrome_options.add_argument('--disable-dev-shm-usage')165 chrome_options.add_argument('--disable-gpu')166 chrome_options.add_argument('user-data-dir=' + profile_dir)167 if headless:168 chrome_options.add_argument('--headless')169 self._options = chrome_options170 self._driver = ChromeDriverManager(chrome_type=browser_type).install()171 def new(self):172 return webdriver.Chrome(173 self._driver,174 options=self._options)175class UpdateTracker:176 def __init__(self, dbpath):177 conn = sqlite3.connect(dbpath)178 cur = conn.cursor()179 try:180 for q in DB_INIT:181 cur.execute(q)182 conn.commit()183 cur.execute("SELECT 1 FROM update_ts WHERE name = ?", ("last",))184 if cur.fetchone() is None:185 cur.execute("INSERT INTO update_ts (name, value) VALUES (?,?)",186 ("last", 0.))187 conn.commit()188 cur.execute("SELECT 1 FROM update_ts WHERE name = ?", ("login",))189 if cur.fetchone() is None:190 cur.execute("INSERT INTO update_ts (name, value) VALUES (?,?)",191 ("login", 0.))192 conn.commit()193 finally:194 cur.close()195 self._conn = conn196 def last_update(self):197 cur = self._conn.cursor()198 try:199 cur.execute("SELECT value FROM update_ts WHERE name = ?",200 ("last",))201 return cur.fetchone()[0]202 finally:203 cur.close()204 def last_login(self):205 cur = self._conn.cursor()206 try:207 cur.execute("SELECT value FROM update_ts WHERE name = ?",208 ("login",))209 return cur.fetchone()[0]210 finally:211 cur.close()212 def update(self, ts):213 c = self._conn214 with c:215 c.execute("UPDATE update_ts SET value = ? WHERE name = ? AND value < ?",216 (float(ts), "last", float(ts)))217 def login(self, ts):218 c = self._conn219 with c:220 c.execute("UPDATE update_ts SET value = ? WHERE name = ? AND value < ?",221 (float(ts), "login", float(ts)))222 def close(self):223 self._conn.close()224 self._conn = None225def random_interval(base, min_drift, max_drift):226 return base + min_drift + random() * (max_drift - min_drift)227class Scheduler:228 def __init__(self, last_login, last_update):229 self._it = self._iter_events(last_login, last_update)230 def __iter__(self):231 return self232 def __next__(self):233 return next(self._it)234 @staticmethod235 def _event_stream(token, last_occured, base, min_drift, max_drift):236 t = max(last_occured + random_interval(base, min_drift, max_drift), time())237 yield ScheduleEntry(when=t, what=token)238 while True:239 t += random_interval(base, min_drift, max_drift)240 yield ScheduleEntry(when=t, what=token)241 @staticmethod242 def _iter_events(last_login, last_update):243 return Scheduler._event_stream(ScheduledEvent.UPDATE,244 last_update,245 UPDATE_INTERVAL,246 UPDATE_INTERVAL_MIN_DRIFT,247 UPDATE_INTERVAL_MAX_DRIFT)248def do_login(browser_factory, timeout):249 browser = browser_factory.new()250 try:251 login(browser, timeout)252 finally:253 browser.quit()254def do_update(browser_factory, timeout):255 browser = browser_factory.new()256 try:257 update(browser, timeout)258 finally:259 browser.quit()260def update_loop(browser_factory, tracker, timeout):261 logger = logging.getLogger("EVLOOP")262 last_update = tracker.last_update()263 last_login = tracker.last_login()264 logger.info("Starting scheduler. "265 "Last update @ %.3f (%s); last refresh @ %.3f (%s).",266 last_update, ctime(last_update),267 last_login, ctime(last_login))268 for ev in Scheduler(last_login, last_update):269 logger.info("Next event is %s @ %.3f (%s)",270 ev.what.name, ev.when, ctime(ev.when))271 wall_clock_wait(ev.when)272 try:273 if ev.what is ScheduledEvent.REFRESH:274 logger.info("Refreshing session now!")275 do_login(browser_factory, timeout)276 tracker.login(time())277 elif ev.what is ScheduledEvent.UPDATE:278 logger.info("Updating CVs now!")279 do_update(browser_factory, timeout)280 tracker.update(time())281 except KeyboardInterrupt:282 raise283 except Exception as exc:284 logger.exception("Event %s handling failed: %s", ev.what.name, str(exc))285def sig_handler(signum, frame):286 raise KeyboardInterrupt287def main():288 args = parse_args()289 mainlogger = setup_logger("MAIN", args.verbosity)290 setup_logger("UPDATE", args.verbosity)291 setup_logger("LOGIN", args.verbosity)292 setup_logger("EVLOOP", args.verbosity)293 os.makedirs(args.data_dir, mode=0o700, exist_ok=True)294 profile_dir = os.path.join(args.data_dir, 'profile')295 browser_factory = BrowserFactory(profile_dir,296 args.browser.value,297 args.cmd is Command.update)298 db_path = os.path.join(args.data_dir, 'updater.db')299 tracker = UpdateTracker(db_path)300 signal.signal(signal.SIGTERM, sig_handler)301 try:302 if args.cmd is Command.login:303 mainlogger.info("Login mode. Please enter your credentials in opened "304 "browser window.")305 try:306 do_login(browser_factory, MANUAL_LOGIN_TIMEOUT)307 tracker.login(time())308 except KeyboardInterrupt:309 mainlogger.warning("Interrupted!")310 elif args.cmd is Command.update:311 mainlogger.info("Update mode. Running headless browser.")312 try:313 update_loop(browser_factory, tracker, args.timeout)314 except KeyboardInterrupt:315 pass316 finally:317 mainlogger.info("Shutting down...")318 finally:319 tracker.close()320if __name__ == "__main__":...
test_testcases.py
Source:test_testcases.py
...113 with self.assertRaisesRegex(NoBrowserFactoryError, r'^Browser brand "EDGE"'):114 super().setUp()115 def tearDown(self):116 self.assertFalse(hasattr(self, 'driver'))117 def test_no_browser_factory(self):118 """ NoBrowserFactoryError was raised and the "browser_factory" attribute is None """119 self.assertIsNone(self.browser_factory)120class NoInternetExplorerWebGUITests(SeleniumWebGUITestCase):121 """ No MS Internet Explorer Browser Web GUI Tests.122 Prove that unit tests raise NoBrowserFactoryError.123 """124 # Settings: Missing Browser125 BROWSER_BRAND = 'INTERNETEXPLORER'126 def setUp(self):127 with self.assertRaisesRegex(NoBrowserFactoryError, r'^Browser brand "INTERNETEXPLORER"'):128 super().setUp()129 def tearDown(self):130 self.assertFalse(hasattr(self, 'driver'))131 def test_no_browser_factory(self):132 """ NoBrowserFactoryError was raised and the "browser_factory" attribute is None """133 self.assertIsNone(self.browser_factory)134class NoSafariWebGUITests(SeleniumWebGUITestCase):135 """ No Mac Safari Browser Web GUI Tests.136 Prove that unit tests raise NoBrowserFactoryError.137 """138 # Settings: Missing Browser139 BROWSER_BRAND = 'SAFARI'140 def setUp(self):141 with self.assertRaisesRegex(NoBrowserFactoryError, r'^Browser brand "SAFARI"'):142 super().setUp()143 def tearDown(self):144 self.assertFalse(hasattr(self, 'driver'))145 def test_no_browser_factory(self):146 """ NoBrowserFactoryError was raised and the "browser_factory" attribute is None """...
py_quality_services.py
Source:py_quality_services.py
...30 """Choose interface for future browser.31 :return: Browser instance.32 :rtype: Browser.33 """34 return cls.get_browser_factory().get_browser()35 @classmethod36 def get_browser_factory(cls) -> BF:37 """Select a factory for browsers if it does not exist, install it.38 :return: Factory that implements BaseBrowserFactory.39 :rtype: BF.40 """41 if getattr(cls.get_instance(), 'browser_factory', None) is None:42 cls.set_default_browser_factory()43 return cls.get_instance().browser_factory44 @classmethod45 def set_browser_factory(cls, browser_factory: BF) -> None:46 """Set factory in current instance that implements BaseBrowserFactory.47 :param browser_factory: Factory implementing the interface BaseBrowserFactory.48 """49 setattr(cls.get_instance().__class__, 'browser_factory', browser_factory)50 @classmethod51 def set_default_browser_factory(cls) -> None:52 """Choose interface for browser factory."""53 browser_factory = cls.get_local_browser_factory()54 cls.set_browser_factory(browser_factory=browser_factory)55 @classmethod56 def get_instance(cls) -> T:57 """Get or create current instance.58 :return: Get or create current class.59 :rtype: T.60 """61 if getattr(LOCAL, '_instance_container', None) is None:62 setattr(LOCAL, '_instance_container', cls())63 return getattr(LOCAL, '_instance_container', None)64 @classmethod65 def get_service_provider(cls) -> Injector:66 """Get injector instance.67 :return: Injector object.68 :rtype: Injector.69 """70 return cls.get_instance().get_injector()71 @classmethod72 def get(cls, clz: ty.Any) -> ty.Any:73 """Get instance from injector instance.74 :param clz: Class that is associated.75 :return: Instance which is registered in injector.76 :rtype: ty.Any.77 """78 return cls.get_service_provider().get(clz)79 @classmethod80 def get_local_browser_factory(cls) -> LocalBaseBrowserFactory:81 """Get LocalBaseBrowserFactory from injector instance which implements BaseBrowserFactory.82 :return: Get LocalBaseBrowserFactory instance.83 :rtype: LocalBaseBrowserFactory.84 """85 return cls.get(LocalBaseBrowserFactory)86 @classmethod87 def get_element_factory(cls) -> ElementFactory:88 return cls.get(ElementFactory)89 @classmethod90 def get_browser_profile(cls) -> BrowserProfile:91 """Get BrowserProfile from injector instance which implements IBrowserProfile.92 :return: Get BrowserProfile instance.93 :rtype: BrowserProfile.94 """...
testcases.py
Source:testcases.py
1""" Selenium Web GUI Test Harness for Python unittest2Use these unittest.TestCase subclasses to run Web GUI tests.3"""4import logging5import unittest6from browser_emulators.chrome.grid_session import ChromeBrowserGridSession7from browser_emulators.chrome.local_session import ChromeBrowserSession8from browser_emulators.firefox.grid_session import FirefoxBrowserGridSession9from browser_emulators.firefox.local_session import FirefoxBrowserSession10# log package name.11log = logging.getLogger('.'.join(__name__.split('.')[:-1]))12# BRAND Key => (HEADLESS=True, Headless=False)13BROWSER_SESSION_CLASS = {14 'ANDROID': None,15 'CHROME': (ChromeBrowserGridSession, ChromeBrowserSession),16 'EDGE': None,17 'FIREFOX': (FirefoxBrowserGridSession, FirefoxBrowserSession),18 'HTMLUNIT': None,19 'HTMLUNITWITHJS': None,20 'INTERNETEXPLORER': None,21 'IPAD': None,22 'IPHONE': None,23 'OPERA': None,24 'PHANTOMJS': None,25 'SAFARI': None,26 'WEBKITGTK': None,27}28class NoBrowserFactoryError(NotImplementedError):29 """ No Browser Factory Error.30 This browser brand has no get_driver() factory class.31 """32 def __init__(self, browser_brand):33 super().__init__(34 'Browser brand "{}" has no Web Driver factory class.'.format(35 browser_brand))36class SeleniumWebGUITestCase(unittest.TestCase):37 """ Selenium Web GUI Test Case.38 This Test Case provides a QA or Regression testing plan.39 This Selenium client describes a Web GUI interface.40 A Selenium Grid service is deployed to emulate browsers already.41 Each test case method should start a browser session and traverse42 its GUI to validate its health.43 """44 # Change these constants in the subclass to set the browser instance.45 GRID_URL = 'http://127.0.0.1:4444/wd/hub'46 BROWSER_BRAND = 'Chrome' # Chrome, FireFox, ...47 PLATFORM = 'ANY' # "ANY" or Linux, Windows, ...48 VERSION = None # Browser version (None means ANY)49 HEADLESS = True50 PAGE_LOAD_TIMEOUT = 20.0 # seconds51 LOG_VERBOSE = True52 LOG_TO_FILE = None53 ACCEPT_SSL_CERTS = False54 HTTP_PROXY_HOST = None55 HTTP_PROXY_PORT = 8056 @classmethod57 def _select_browser_brand_factory(cls, browser_brand):58 """ Select Browser Brand Factory Class.59 :param str browser_brand: match BROWSER_BRAND to its class60 :returns: BrowserSession factory or None when not available61 """62 browser_brand = browser_brand.upper()63 browser_factory = BROWSER_SESSION_CLASS.get(browser_brand, None)64 if browser_factory is not None:65 try:66 if cls.HEADLESS:67 browser_factory = browser_factory[0] # grid session68 else:69 browser_factory = browser_factory[1] # local session70 except IndexError:71 browser_factory = None72 return browser_factory73 @classmethod74 def setUpClass(cls):75 """76 Create a browser factory to get_driver() objects.77 Each browser session has the "desired capabilities" from the constants.78 """79 browser_factory_class = cls._select_browser_brand_factory(cls.BROWSER_BRAND)80 if browser_factory_class is not None:81 cls.browser_factory = browser_factory_class(82 command_executor=cls.GRID_URL,83 platform=cls.PLATFORM,84 browser_version=cls.VERSION,85 headless=cls.HEADLESS,86 page_load_timeout=cls.PAGE_LOAD_TIMEOUT,87 log_verbose=cls.LOG_VERBOSE,88 log_to_file=cls.LOG_TO_FILE,89 accept_ssl_certs=cls.ACCEPT_SSL_CERTS,90 proxy_host=cls.HTTP_PROXY_HOST,91 proxy_port=cls.HTTP_PROXY_PORT,92 raise_errors=True)93 else:94 cls.browser_factory = None95 def setUp(self):96 """ Set Up.97 Create a new browser session "driver" for the current tests.98 """99 super().setUp()100 if self.browser_factory is not None:101 self.driver = self.browser_factory.get_driver()102 else:103 raise NoBrowserFactoryError(self.BROWSER_BRAND)104 def tearDown(self):105 """ Tear Down.106 Quit browser session and release resources.107 """108 super().tearDown()109 if self.driver:110 self.driver.quit()...
LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!