Пример #1
0
def test_abort_eyes(vg_runner, driver):
    eyes = Eyes(vg_runner)
    eyes.configuration.add_browser(800, 600, BrowserType.CHROME)
    driver.get("https://demo.applitools.com")
    eyes.open(driver, "Python VisualGrid", "TestAbortVGEyes")
    eyes.check_window()
    eyes.abort()
def test_default_rendering_of_multiple_targets(driver, vg_runner):
    driver.get("https://applitools.com/helloworld")
    eyes = Eyes(vg_runner)
    eyes.configuration.add_browser(800, 600, BrowserType.CHROME)
    eyes.configuration.add_browser(800, 600, BrowserType.FIREFOX)
    eyes.configuration.add_browser(1200, 800, BrowserType.CHROME)
    eyes.configuration.add_browser(1200, 800, BrowserType.FIREFOX)
    eyes.configuration.app_name = "TestDefaultRendering"
    eyes.configuration.test_name = "TestDefaultRenderingOfMultipleTargets"

    try:
        eyes.open(driver)
        eyes.check("", Target.window())
        eyes.close()
    finally:
        eyes.abort()

    all_test_results = vg_runner.get_all_test_results()
    batch_id = None
    batch_name = None
    for trc in all_test_results:
        if batch_id is None:
            batch_id = trc.test_results.batch_id
        if batch_name is None:
            batch_name = trc.test_results.batch_name

        assert batch_id == trc.test_results.batch_id
        assert batch_name == trc.test_results.batch_name
Пример #3
0
def eyes(request):
    eyes = Eyes()
    if os.environ.get("APPLITOOLS_API_KEY") is not None:
        eyes.api_key = os.getenv("APPLITOOLS_API_KEY")
        eyes.open(get_driver(),
                  app_name=configs.APP_NAME,
                  test_name=request.node.name)
    yield eyes
    eyes.abort()
Пример #4
0
def test_open_close_abort_eyes(local_chrome_driver):
    eyes = Eyes()
    eyes.open(local_chrome_driver, "USDK Test", "Test create close abort eyes")

    eyes.close(False)
    abort_result = eyes.abort()

    assert abort_result is None
Пример #5
0
def test_open_abort_eyes(local_chrome_driver):
    eyes = Eyes()
    eyes.open(local_chrome_driver, "USDK Test", "Test create abort eyes")

    abort_result = eyes.abort()

    assert len(abort_result) == 1
    assert abort_result[0].is_failed
    assert abort_result[0].is_aborted
Пример #6
0
def test_locate_with_missing_locator_returns_empty_result(local_chrome_driver):
    local_chrome_driver.get(
        "https://applitools.github.io/demo/TestPages/SimpleTestPage")
    eyes = Eyes()
    eyes.open(
        local_chrome_driver,
        "USDK Test",
        "Test missing locator",
        {
            "width": 800,
            "height": 600
        },
    )
    try:
        located = eyes.locate(VisualLocator.name("non-existing-locator"))
        assert located == {"non-existing-locator": []}
        eyes.close(False)
    finally:
        eyes.abort()
def test_test_vg_check_source_sent(driver, vg_runner):
    driver.get("https://applitools.com/helloworld")
    eyes = Eyes(vg_runner)
    eyes.configuration.add_browser(800, 600, BrowserType.CHROME)
    eyes.configuration.add_browser(800, 600, BrowserType.FIREFOX)
    eyes.configuration.app_name = "TestCheckSourceSent"
    eyes.configuration.test_name = "TestVgCheckSourceSent"

    try:
        eyes.open(driver)
        with patch(
                "applitools.core.server_connector.ServerConnector.match_window"
        ) as smw:
            eyes.check("", Target.window())
            eyes.close()
            match_window_data = smw.call_args[0][1]
    finally:
        eyes.abort()

    assert match_window_data.options.source == "applitools.com"
Пример #8
0
def eyes_setup(runner, batch_info, stitch_mode, emulation):
    """
    Basic Eyes setup. It'll abort test if wasn't closed properly.
    """
    eyes = Eyes(runner)
    # Initialize the eyes SDK and set your private API key.
    eyes.api_key = os.environ["APPLITOOLS_API_KEY"]
    eyes.configure.batch = batch_info
    eyes.configure.branch_name = "master"
    eyes.configure.parent_branch_name = "master"
    eyes.configure.set_stitch_mode(stitch_mode)
    eyes.configure.set_save_new_tests(False)
    eyes.configure.set_hide_caret(True)
    eyes.configure.set_hide_scrollbars(True)
    is_emulation, orientation, page = emulation
    if is_emulation:
        eyes.add_property("Orientation", orientation)
        eyes.add_property("Page", page)
    yield eyes
    # If the test was aborted before eyes.close was called, ends the test as aborted.
    eyes.abort()
    if runner is not None:
        runner.get_all_test_results(False)
Пример #9
0
class TestDemoApp(object):
    """
    This class contains all the test cases for Visual AI based testing of the application, because the number of test
    cases are expected to be sinificantly less than in the Traditional way.

    Eyes is initialized only once for possible efficiency increase.

    Setting explicit batch id seems to have a bug in the current version of selenium-based python implementation:
    sessions/running API keeps returning 400 response code when eyes.batch is set.
    """

    def setup_class(self):
        self.__config = configparser.ConfigParser()
        self.__config.read("config.ini")

        self.__driver = webdriver.Chrome()
        self.__wait = WebDriverWait(self.__driver, DEFAULT_TIMEOUT_SEC)

        self.__eyes = Eyes()
        self.__eyes.api_key = self.__config["applitools"]["api_key"]

    def teardown_class(self):
        self.__driver.quit()
        self.__eyes.abort()

    def teardown_method(self):
        self.__eyes.force_full_page_screenshot = False

    def test_login_page_appearance(self):
        self.__driver.get(self.__config["environment"]["base_url"])
        self.__eyes.open(self.__driver, "DemoApp", "Login Page Appearance", DEFAULT_VIEWPORT)
        self.__eyes.check_window("Login Page Default")
        self.__eyes.close()

    @pytest.mark.parametrize("user, password, test_name",
                             [("", "", "Both Empty"),
                              (" ", "", "Password Empty"),
                              ("", " ", "User Empty")])
    def test_credentials_missing(self, user, password, test_name):
        page = Pages.Login(self.__driver, self.__config["environment"]["base_url"])
        page.type_user_name(user)
        page.type_password(password)
        page.submit()

        self.__wait.until(lambda _: len(page.alerts) == 1)
        self.__eyes.open(self.__driver, "DemoApp", f"Credentials Missing - {test_name}", DEFAULT_VIEWPORT)
        self.__eyes.check_window("Login Page With Alert")
        self.__eyes.close()

    @pytest.mark.parametrize("missing", ["User", "Password", "Both"])
    def test_credentials_removed(self, missing):
        page = Pages.Login(self.__driver, self.__config["environment"]["base_url"])
        page.type_user_name(DEFAULT_CREDENTIALS["user"])
        page.type_password(DEFAULT_CREDENTIALS["password"])

        self.__remove_credential(page, missing)
        page.submit()

        self.__wait.until(lambda _: len(page.alerts) == 1)

        self.__eyes.open(self.__driver, "DemoApp", f"Credentials Removed - {missing} Empty", DEFAULT_VIEWPORT)
        self.__eyes.check_window("Login Page With Alert")
        self.__eyes.close()

    def test_successful_login(self):
        page = Pages.Login(self.__driver, self.__config["environment"]["base_url"])
        page.type_user_name(DEFAULT_CREDENTIALS["user"])
        page.type_password(DEFAULT_CREDENTIALS["password"])
        page.submit()

        self.__wait.until(lambda _: Pages.CustomerDashboard(self.__driver).is_loaded())

        self.__eyes.open(self.__driver, "DemoApp", "Successful Login", DEFAULT_VIEWPORT)
        self.__eyes.check_window("Customer Dashboard")
        self.__eyes.close()

    def test_table_sorting(self):
        self.__do_login()
        page = Pages.CustomerDashboard(self.__driver)

        self.__eyes.force_full_page_screenshot = True
        self.__eyes.open(self.__driver, "DemoApp", "Table Sorting", DEFAULT_VIEWPORT)
        self.__eyes.check_window("Customer Dashboard - Default")

        page.order_by_amount()

        self.__eyes.check_window("Customer Dashboard - Sorted by Amount")
        self.__eyes.close()

    @pytest.mark.parametrize("width, height",
                             [(640, 480),
                              (800, 600),
                              (1024, 768)])
    def test_canvas_chart(self, width, height):
        self.__do_login()
        page = Pages.CustomerDashboard(self.__driver)

        page.view_expense_chart()
        self.__wait_for_canvas_animation()

        self.__eyes.open(self.__driver,
                         "DemoApp",
                         f"Expenses Chart - {width}x{height}",
                         {'width': width, 'height': height})

        self.__eyes.check_window("Chart Two Years")

        page.include_another_year()
        self.__wait_for_canvas_animation()

        self.__eyes.check_window("Chart Three Years")
        self.__eyes.close()

    def test_two_adverts_on_dashboard(self):
        self.__do_login(query_string="?showAd=true")

        self.__eyes.open(self.__driver, "DemoApp", "Adverts On Dashboard", DEFAULT_VIEWPORT)
        self.__eyes.check_window("Dashboard With Adverts")
        self.__eyes.close()

    def __do_login(self, credentials=DEFAULT_CREDENTIALS, query_string=""):
        page = Pages.Login(self.__driver, self.__config["environment"]["base_url"], query_string)
        page.type_user_name(credentials["user"])
        page.type_password(credentials["password"])
        page.submit()

        self.__wait.until(lambda _: Pages.CustomerDashboard(self.__driver).is_loaded())

    @staticmethod
    def __remove_credential(page, missing):
        if missing not in ["User", "Password", "Both"]:
            raise AttributeError

        if missing in ["User", "Both"]:
            page.type_user_name("")

        if missing in ["Password", "Both"]:
            page.type_password("")

    @staticmethod
    def __wait_for_canvas_animation():
        """
        time.sleep is a very bad practice in test automation in general, however in this case the animation duration of
        JavaScript drawing on canvas is explicitly known, it is expected to remain the same unless requirements change.
        :return:s
        """
        time.sleep(CANVAS_ANIMATION_SEC)
Пример #10
0
class TestsVisualAI(unittest.TestCase):
    _batch = BatchInfo('Hackathon')
    _url = 'https://demo.applitools.com/hackathonV2.html'

    def setUp(self):
        self.driver = webdriver.Chrome('./chromedriver')
        self.eyes = Eyes()
        self.eyes.api_key = os.environ['APPLITOOLS_API_KEY']
        self.eyes.batch = self._batch
        self.driver.get(self._url)

    def tearDown(self):
        self.eyes.abort()
        self.driver.close()

    def test_01_elements_presence_on_login_page(self):
        self.eyes.open(self.driver, "Hackathon app", "Test 01: elements presence", {'width': 800, 'height': 600})
        self.eyes.check_window()
        self.eyes.close()

    user_password_data = lambda: (
        ('', 'p'), ('u', ''),
        ('', ''), ('u', 'p')
    )

    @data_provider(user_password_data)
    def test_02_login_errors(self, username, password):
        self.setUp()
        dr = self.eyes.open(self.driver, "Hackathon app",
                            "Test 02: user={} and password={}".format(username, password),
                            {'width': 800, 'height': 600})
        dr.get(self._url)
        login_page = LoginPage(dr)
        login_page.set_username(username)
        login_page.set_password(password)
        login_page.click_login_button()
        self.eyes.check_window()
        self.eyes.check_region(Region(left=170, top=280, width=350, height=100))
        self.eyes.close_async()

    def test_03_sort_order_and_data(self):
        login_page = LoginPage(self.driver)
        login_page.login('seba', 'seba')
        dr = self.eyes.open(self.driver, "Hackathon app", "Test 03: Table Sorting validation",
                            {'width': 800, 'height': 600})
        home_page = HomePage(dr)
        home_page.click_amount_header()
        home_page.scroll_down_to_chart()
        self.eyes.check_window()
        self.eyes.close()

    def test_04_chart_validation(self):
        login_page = LoginPage(self.driver)
        login_page.login('seba', 'seba')
        home_page = HomePage(self.driver)
        home_page.click_compare_expenses()
        dr = self.eyes.open(self.driver, "Hackathon app", "Test 04: Chart validation",
                            {'width': 800, 'height': 600})
        chart_page = ChartPage(dr)
        self.eyes.check_window()
        chart_page.click_show_next_year_button()
        self.eyes.check_window()
        self.eyes.close()

    def test_05_dynamic_add(self):
        self.driver.get('https://demo.applitools.com/hackathonV2.html?showAd=true')
        login_page = LoginPage(self.driver)
        login_page.login('seba', 'seba')
        self.eyes.open(self.driver, "Hackathon app", "Test 05: Dynamic content validation",
                            {'width': 800, 'height': 600})
        self.eyes.check_window()
        self.eyes.close()