Beispiel #1
0
class WebAPP(common.APP):
    def __init__(self,
                 app_config=None,
                 app_name=None,
                 apk_pkg_name=None,
                 apk_activity_name=None):
        self.driver = None
        self.app_type = common.APP_TYPE_WEB
        self.app_name = app_name
        self.app_id = ""
        self.cur_path = os.getcwd()
        self.config_file = "data.conf"
        self.device_platform = ""
        self.test_type = ""
        self.read_config()
        self.test_url = app_config["test-url"]
        self.baseline_path = self.test_url + "/../../data/" + self.device_platform
        self.text_value = {}
        self.picture_list = []
        self.color_dict = {
            "rgb(255, 0, 0)": "red",
            "rgb(0, 255, 0)": "green",
            "rgb(0, 0, 255)": "blue",
            "rgb(255, 255, 0)": "yellow",
            "rgb(0, 0, 0)": "black",
            "rgb(0, 128, 0)": "green",
            "rgb(255, 255, 255)": "white",
            "rgba(0, 0, 0, 0)": "white"
        }
        apk_activity_name = apk_activity_name
        apk_pkg_name = apk_pkg_name
        if "platform" in app_config and "name" in app_config["platform"]:
            if app_config["platform"]["name"].upper().find('ANDROID') >= 0:
                if apk_activity_name == apk_pkg_name is None:
                    if "app_launcher" in app_config and app_config[
                            "app_launcher"] == "XWalkLauncher":
                        self.app_name = self.app_name.replace("-", "_")
                        apk_name_update = self.app_name.capitalize()
                        apk_activity_name = ".%sActivity" % apk_name_update
                        apk_pkg_name = "org.xwalk.%s" % self.app_name
                    if "app_launcher" in app_config and app_config[
                            "app_launcher"] == "CordovaLauncher":
                        self.app_name = self.app_name.replace("-", "_")
                        apk_activity_name = ".%s" % self.app_name
                        apk_pkg_name = "org.xwalk.%s" % self.app_name
                self.app_config_str = json.dumps(app_config).replace(
                    "TEST_APP_NAME",
                    self.app_name).replace("TEST_APP_ID", self.app_id).replace(
                        "TEST_PKG_NAME",
                        apk_pkg_name).replace("TEST_ACTIVITY_NAME",
                                              apk_activity_name)
            if app_config["platform"]["name"].upper().find('DEEPIN') >= 0:
                app_config.update({
                    "desired-capabilities": {
                        "loggingPrefs": {},
                        "xwalkOptions": {
                            "binary": "/usr/bin/TEST_BINARY",
                            "debugPort": "12450"
                        }
                    }
                })
                self.app_config_str = json.dumps(app_config).replace(
                    "TEST_BINARY", self.app_name)
            if app_config["platform"]["name"].upper().find('WINDOWS') >= 0:
                self.app_config_str = json.dumps(app_config).replace(
                    "TEST_BINARY", self.app_name)
            self.app_config = json.loads(self.app_config_str)
        if "url-prefix" in app_config:
            self.url_prefix = app_config["url-prefix"]
        else:
            self.url_prefix = ""

    def read_config(self):
        try:
            config = ConfigParser.ConfigParser()
            with open(self.config_file, "r") as cfgfile:
                config.readfp(cfgfile)
            self.device_platform = config.get('info', 'platform')
            self.test_type = config.get('info', 'test_type')
        except Exception as e:
            print "Parser config data.config failed: %s" % e

    def __get_element_by_xpath(self, xpath, display=True):
        try:
            element = self.driver.find_element_by_xpath(xpath)
            if display:
                try:
                    if element.is_displayed():
                        return element
                except StaleElementReferenceException:
                    pass
            else:
                return element
            print "Failed to get element"
        except Exception as e:
            print "Failed to get element: %s" % e
        return None

    def __get_element_by_key_attr(self, key, attr, display=True):
        xpath = "//*[@%s='%s']" % (attr, key)
        try:
            element = self.driver.find_element_by_xpath(xpath)
            if display:
                try:
                    if element.is_displayed():
                        return element
                except StaleElementReferenceException:
                    pass
            else:
                return element
            print "Failed to get element"
        except Exception as e:
            print "Failed to get element: %s" % e
        return None

    def __get_element_by_tag(self, key, display=True):
        try:
            element = self.driver.find_element_by_tag(key)
            return element
        except Exception as e:
            print "Failed to get element: %s" % e
            return None

    def __get_element_by_key(self, key, display=True):
        try:
            for i_element in self.driver.find_elements_by_xpath(
                    str("//*[@id='%(key)s']|"
                        "//*[@name='%(key)s']|"
                        "//*[@value='%(key)s']|"
                        "//*[contains(@class, '%(key)s')]|"
                        "//div[contains(text(), '%(key)s')]|"
                        "//button[contains(text(), '%(key)s')]|"
                        "//input[contains(text(), '%(key)s')]|"
                        "//textarea[contains(text(), '%(key)s')]|"
                        "//a[contains(text(), '%(key)s')]") % {'key': key}):
                if display:
                    try:
                        if i_element.is_displayed():
                            return i_element
                    except StaleElementReferenceException:
                        pass
                else:
                    return i_element
            print "Failed to get element"
        except Exception as e:
            print "Failed to get element: %s" % e
        return None

    def __get_element_by_keys(self, key_p, key_c, display=True):
        try:
            for i_element in self.driver.find_elements_by_xpath(
                    str("//*[@id='%(key)s']|"
                        "//*[@name='%(key)s']|"
                        "//*[@value='%(key)s']|"
                        "//*[contains(@class, '%(key)s')]|"
                        "//div[contains(text(), '%(key)s')]|"
                        "//button[contains(text(), '%(key)s')]|"
                        "//input[contains(text(), '%(key)s')]|"
                        "//textarea[contains(text(), '%(key)s')]|"
                        "//a[contains(text(), '%(key)s')]") % {'key': key_p}):
                get_element = False
                if display:
                    try:
                        if i_element.is_displayed():
                            get_element = True
                    except StaleElementReferenceException:
                        pass
                else:
                    get_element = True

                if get_element:
                    print "%s ++ %s" % (i_element.get_attribute("id"),
                                        i_element.get_attribute("class"))
                    for ii_element in i_element.find_elements_by_xpath(
                            str("./*[@id='%(key)s']|"
                                "./*[@name='%(key)s']|"
                                "./*[@value='%(key)s']|"
                                "./*[contains(@class, '%(key)s')]|"
                                "./div[contains(text(), '%(key)s')]|"
                                "./button[contains(text(), '%(key)s')]|"
                                "./input[contains(text(), '%(key)s')]|"
                                "./textarea[contains(text(), '%(key)s')]|"
                                "./a[contains(text(), '%(key)s')]") %
                        {'key': key_c}):
                        if display:
                            try:
                                if ii_element.is_displayed():
                                    return ii_element
                            except StaleElementReferenceException:
                                pass
                        else:
                            return ii_element

            print "Failed to get element"
        except Exception as e:
            print "Failed to get element: %s" % e
        return None

    def __check_normal_text(self, text, display=True):
        try:
            for i_element in self.driver.find_elements_by_xpath(
                    str('//*[@value="{text}"]|'
                        '//*[contains(normalize-space(.),"{text}") '
                        'and not(./*[contains(normalize-space(.),"{text}")])]'.
                        format(text=text))):
                if display:
                    try:
                        if i_element.is_displayed():
                            return i_element
                    except StaleElementReferenceException:
                        pass
                else:
                    return i_element
        except Exception as e:
            print "Failed to get element: %s" % e
        return None

    def check_normal_text_element_not_exist(self, text, key, display=True):
        element = self.__get_element_by_key(key, display)
        if element:
            try:
                e_list = element.find_elements_by_xpath(
                    str('//*[@value="{text}"]|'
                        '//*[contains(normalize-space(.),"{text}") '
                        'and not(./*[contains(normalize-space(.),"{text}")])]'.
                        format(text=text)))
                for i_element in e_list:
                    if i_element.text == text:
                        return False
                return True
            except Exception as e:
                print "Failed to get element: %s" % e
        return False

    def __check_normal_text_element(self, text, key, display=True):
        element = self.__get_element_by_key(key, display)
        if element:
            try:
                for i_element in element.find_elements_by_xpath(
                        str('//*[@value="{text}"]|'
                            '//*[contains(normalize-space(.),"{text}") '
                            'and not(./*[contains(normalize-space(.),"{text}")])]'
                            .format(text=text))):
                    if display:
                        try:
                            if i_element.is_displayed():
                                return i_element
                        except StaleElementReferenceException:
                            pass
                    else:
                        return i_element
            except Exception as e:
                print "Failed to get element: %s" % e
        return None

    def compare_two_values(self, first=None, second=None):
        try:
            if first.isdigit():
                if eval(first) < eval(self.text_value[second]):
                    return True
                else:
                    return False
            else:
                if eval(self.text_value[first]) < eval(
                        self.text_value[second]):
                    return True
                else:
                    return False
        except Exception as e:
            print "Failed to compare these two param: %s" % e
        return False

    def judge_saved_value(self, value=None, result=None):
        try:
            if self.text_value[value] == result:
                return True
            else:
                return False
        except Exception as e:
            print "Failed to judge saved vaule: %s" % e
        return False

    def compare_two_values_range(self, first=None, second=None, value=None):
        try:
            result = eval(self.text_value[second]) - eval(
                self.text_value[first])
            if result >= eval(value):
                return True
            else:
                return False
        except Exception as e:
            print "Failed to compare these two param with value: %s" % e
        return False

    def judge_value_range(self, value=None, first=None, second=None):
        try:
            result = eval(self.text_value[value])
            if (eval(second) >= result) and (eval(first) <= result):
                return True
            elif (eval(second) <= result) and (eval(first) >= result):
                return True
            else:
                return False
        except Exception as e:
            print "Failed to judge value range: %s" % e
        return False

    def save_content(self, p_name=None, key=None):
        try:
            js_script = 'var style=document.getElementById(\"' + \
                key + '\").innerHTML; return style'
            style = self.driver.execute_script(js_script)
            self.text_value[p_name] = style
            return True
        except Exception as e:
            print "Failed to get element: %s" % e
            return False

    def launch_app(self):
        try:
            desired_capabilities = self.app_config["desired-capabilities"]
            if self.app_config["platform"]["name"] == "android":
                self.driver = WebDriver(str(self.app_config["driver-url"]),
                                        desired_capabilities)
            elif self.app_config["platform"]["name"] in ("deepin", "windows"):
                self.driver = WebDriver(str(self.app_config["driver-url"]),
                                        desired_capabilities,
                                        keep_alive=True)
        except Exception as e:
            print "Failed to launch %s: %s" % (self.app_name, e)
            return False
        return True

    def switch_url(self, url, with_prefix=True):
        if with_prefix:
            url = urljoin(self.url_prefix, url)
        try:
            self.driver.get(url)
        except Exception as e:
            print "Failed to visit %s: %s" % (url, e)
            return False
        return True

    def title(self):
        try:
            return self.driver.title
        except Exception as e:
            print "Failed to get title: %s" % e
            return None

    def current_url(self):
        try:
            if isinstance(self.driver.current_url, dict):
                return self.driver.current_url['CurrentUrl']
            else:
                return self.driver.current_url
        except Exception as e:
            print "Failed to get current url: %s" % e
            return None

    def reload(self):
        self.driver.refresh()
        return True

    def back(self):
        self.driver.back()
        return True

    def forward(self):
        self.driver.forward()
        return True

    def check_normal_text_timeout(self, text=None, display=True, timeout=2):
        end_time = time.time() + timeout
        while time.time() < end_time:
            if self.__check_normal_text(text, display):
                return True
            time.sleep(0.2)
        return False

    def check_normal_title_timeout(self, text=None, display=True, timeout=2):
        end_time = time.time() + timeout
        while time.time() < end_time:
            if self.title() == text:
                return True
            time.sleep(0.2)
        return False

    def check_normal_text_element_timeout(self,
                                          text=None,
                                          key=None,
                                          display=True,
                                          timeout=2):
        end_time = time.time() + timeout
        while time.time() < end_time:
            if self.__check_normal_text_element(text, key, display):
                return True
            time.sleep(0.2)
        return False

    def check_normal_text_element_timeout_with_color(self,
                                                     text=None,
                                                     key=None,
                                                     color=None,
                                                     display=True,
                                                     timeout=2):
        end_time = time.time() + timeout
        while time.time() < end_time:
            if self.__check_normal_text_element(text, key, display):
                if self.check_text_color(key, color):
                    return True
            time.sleep(0.2)
        return False

    def check_normal_element_timeout_with_color(self,
                                                key=None,
                                                color=None,
                                                display=True,
                                                timeout=2):
        end_time = time.time() + timeout
        while time.time() < end_time:
            if self.check_background_color(key, color):
                return True
            time.sleep(0.2)
        return False

    def check_background_color(self, key=None, color=None, display=True):
        try:
            js_script = 'var bg_color=document.getElementById(\"' + \
                key + '\").style.backgroundColor; return bg_color'
            bg_color = self.driver.execute_script(js_script)
            if not bg_color:
                js_script = 'var element=document.getElementById(\"' + key + '\");' \
                    ' if(element.currentStyle) {return element.currentStyle.backgroundColor;} ' \
                    ' else { return  document.defaultView.getComputedStyle(element,null).backgroundColor; } '
                bg_color = self.driver.execute_script(js_script)
            if not bg_color:
                bg_color = "white"
            number = re.match(r'[A-Za-z]+$', bg_color)
            if not number:
                bg_color = self.color_dict[bg_color]
            if bg_color.strip() == color:
                return True
        except Exception as e:
            print "Failed to get element color: %s" % e
        return False

    def check_text_color(self, key=None, color=None, display=True):
        try:
            js_script = 'var text_color=document.getElementById(\"' + \
                key + '\").style.color; return text_color'
            text_color = self.driver.execute_script(js_script)
            if not text_color:
                js_script = 'var element=document.getElementById(\"' + key + '\");' \
                    ' if(element.currentStyle) {return element.currentStyle.color;} ' \
                    ' else { return  document.defaultView.getComputedStyle(element,null).color; } '
                text_color = self.driver.execute_script(js_script)
            if not text_color:
                text_color = "black"
            is_rgb = re.match(r'[A-Za-z]+$', text_color)
            if not is_rgb:
                text_color = self.color_dict[text_color]
            if text_color.strip() == color:
                return True
        except Exception as e:
            print "Failed to get element: %s" % e
        return False

    def check_content_type(self, key=None, display=True):
        try:
            js_script = 'var text=document.getElementById(\"' + \
                key + '\").innerText; return text'
            text = self.driver.execute_script(js_script)
            if text.strip() == '':
                return 'none'
            number = re.match(r'(-?\d+)(\.\d+)?', text)
            if number:
                if "." in text:
                    return "float"
                else:
                    return "int"
            else:
                if text.upper() == "TRUE" or text.upper() == "FALSE":
                    return "boolean"
                else:
                    return "string"
        except Exception as e:
            print "Failed to get element text: %s" % e

    def should_see_text_startswith(self, text=None, key=None):
        try:
            js_script = 'var text=document.getElementById(\"' + \
                key + '\").innerHTML; return text'
            content = self.driver.execute_script(js_script)
            if content.strip().startswith(text):
                return True
            else:
                return False
        except Exception as e:
            print "Failed to find text startswith %s" % text
            return False

    def should_see_text_endswith(self, text=None, key=None):
        try:
            js_script = 'var text=document.getElementById(\"' + \
                key + '\").innerHTML; return text'
            content = self.driver.execute_script(js_script)
            if content.strip().endswith(text):
                return True
            else:
                return False
        except Exception as e:
            print "Failed to find text endswith %s" % text
            return False

    def press_element_by_key(self, key, display=True):
        element = self.__get_element_by_key(key, display)
        print "%s == %s" % (element.get_attribute("id"),
                            element.get_attribute("class"))
        if element:
            element.click()
            return True

        return False

    def press_element_by_keys(self, key_p, key_c, display=True):
        element = self.__get_element_by_keys(key_p, key_c, display)
        print "%s == %s" % (element.get_attribute("id"),
                            element.get_attribute("class"))
        if element:
            element.click()
            return True

        return False

    def press_element_by_key_attr(self, key, attr, display=True):
        element = self.__get_element_by_key_attr(key, attr, display)
        print "%s == %s" % (element.get_attribute("id"),
                            element.get_attribute("class"))
        if element:
            element.click()
            return True

        return False

    def click_element_by_keys(self, key_p, key_c, display=True):
        element = self.__get_element_by_keys(key_p, key_c, display)
        print "%s == %s" % (element.get_attribute("id"),
                            element.get_attribute("class"))
        if element:
            ActionChains(self.driver).click(element).perform()
            return True
        return False

    def click_element_by_key(self, key, display=True):
        element = self.__get_element_by_key(key, display)
        if element:
            print "%s == %s" % (element.get_attribute("id"),
                                element.get_attribute("class"))
            if self.app_config["platform"]["name"].upper() == "WINDOWS":
                element.click()
            else:
                ActionChains(self.driver).click(element).perform()
            return True
        return False


# * The method click_element_by_key will fail when VKB shelter the button, and js can avoid this issue.

    def click_element_by_id_with_js(self, key, display=True):
        element = self.__get_element_by_key_attr(key, "id", display)
        print "%s == %s" % (element.get_attribute("id"),
                            element.get_attribute("class"))
        if element:
            js_script = 'document.getElementById(\"' + key + '\").click()'
            self.driver.execute_script(js_script)
            return True
        return False

    def click_element_coords(self, x, y, key, display=True):
        element = self.__get_element_by_key(key, display)
        if element:
            ActionChains(self.driver).move_to_element_with_offset(
                element, x, y).click().perform()
            return True
        return False

    def execute_js_code(self, js_code):
        try:
            return self.driver.execute_script(js_code)
        except Exception as e:
            print "Execute js code failed: %s" % e
            return 0

    # Calculate the location params of element
    def calculate_element_location(self, key, width=0, height=0):
        try:
            if width:
                width = string.atoi(width)
            if height:
                height = string.atoi(height)
            js_script = 'var top=document.getElementById(\"' + \
                key + '\").getBoundingClientRect().top;  return top'
            top = self.execute_js_code(js_script)
            js_script = 'var left=document.getElementById(\"' + \
                key + '\").getBoundingClientRect().left; return left'
            left = self.execute_js_code(js_script)
            if not width:
                js_script = 'var width=document.getElementById(\"' + \
                    key + '\").getBoundingClientRect().width; return width'
                width = self.execute_js_code(js_script)
            if not height:
                js_script = 'var height=document.getElementById(\"' + \
                    key + '\").getBoundingClientRect().height; return height'
                height = self.execute_js_code(js_script)
            return (left, top, left + width, top + height)
        except Exception as e:
            print "Get element location failed: %s" % e
            return 0

    def calculate_resolution_ratio(self, pic_name):
        try:
            js_script = 'var width=window.screen.availWidth; return width'
            body_width = self.execute_js_code(js_script)
            js_script = 'var height=window.screen.availHeight; return height'
            body_height = self.execute_js_code(js_script)
            im = Image.open(pic_name)
            w, h = im.size
            ratio_w = w / body_width
            ratio_h = h / body_height
            ration = 0
            if ratio_w > ratio_h:
                ratio = ratio_w
            else:
                ratio = ratio_h
            return w / ratio, h / ratio
        except Exception as e:
            print "Calculate page picture resolution failed: %s" % e
            return 0

    # Save the specified element as a single picture
    def save_div_as_picture(self, key, element_pic, width=0, height=0):
        try:
            page_pic = "page.png"
            self.driver.get_screenshot_as_file(page_pic)
            self.picture_list.append(page_pic)
            ratio = self.calculate_resolution_ratio(page_pic)
            self.convert_pic(page_pic, ratio)
            box = self.calculate_element_location(key, width, height)
            self.crop_pic(page_pic, element_pic, box)
            self.picture_list.append(element_pic)
            return True
        except Exception as e:
            print "Save element picture failed: %s" % e
            return False

    # Remove these temporary pictures
    def remove_picture(self):
        try:
            picture_list = list(set(self.picture_list))
            for element in picture_list:
                os.remove(element)
            self.picture_list = []
            return True
        except Exception as e:
            print "Remove the tmp pictures fail: %s" % e
            return False

    # Check if 2 files content are the same
    def check_md5_file_same(self, file_name):
        try:
            if self.test_type == "result":
                result_path = self.baseline_path + "/" + file_name + ".md5"
                fp_result = open(result_path, "r")
                str_result = fp_result.read()
                fp_result.close()
                baseline_path = self.baseline_path + \
                    "/" + file_name + "_baseline.md5"
                fp_baseline = open(baseline_path, "r")
                str_baseline = fp_baseline.read()
                fp_baseline.close()
                index = cmp(str_result, str_baseline)
                if not index:
                    return True
                else:
                    return False
            elif self.test_type == "baseline":
                return True
        except Exception as e:
            print "Check md5 file failed: %s" % e
            return False

    # Save pic as base64 data's md5
    def save_base64_md5_pic(self, pic_name):
        try:
            md5file_path = ""
            if self.test_type == "result":
                md5file_path = self.baseline_path + "/" + pic_name + ".md5"
            elif self.test_type == "baseline":
                md5file_path = self.baseline_path + \
                    "/" + pic_name + "_baseline.md5"
            pic_base64 = self.driver.get_screenshot_as_base64()
            pic_md5 = self.get_string_md5(pic_base64)
            fp = open(md5file_path, "w")
            fp.write(pic_md5)
            fp.close()
            return True
        except Exception as e:
            print "Save pic as base64 failed: %s" % e
            return False

    # Save page as pictures
    def save_page_per_conf(self, pic_name):
        try:
            if not os.path.exists(self.baseline_path):
                os.makedirs(self.baseline_path)
            if self.test_type == "result":
                picname_result = self.baseline_path + "/" + pic_name + ".png"
                self.driver.get_screenshot_as_file(picname_result)
                return True
            elif self.test_type == "baseline":
                picname_baseline = self.baseline_path + \
                    "/" + pic_name + "_baseline.png"
                self.driver.get_screenshot_as_file(picname_baseline)
                return True
            else:
                print "Test_type is wrong. It should be baseline or result. Please check the data.config file."
                return False
        except Exception as e:
            print "Save baseline pictures fail: %s" % e
            return False

    def check_base_result_similarity(self, pic_name, similarity):
        resu_pic = self.baseline_path + "/" + pic_name + ".png"
        base_pic = self.baseline_path + "/" + pic_name + "_baseline.png"
        if not os.path.exists(resu_pic):
            print "The result picture %s is not existed! Case fail" % pic_name
            return False
        if not os.path.exists(base_pic):
            print "The baseline picture %s is not existed! Case fail" % base_pic
            return False
        return self.check_pic_same(base_pic, resu_pic, similarity)

    def fill_element_by_key(self, key, text, display=True):
        element = self.__get_element_by_key(key, display)
        if element:
            element.send_keys(text)
            return True
        return False

    def fill_element_by_key_attr(self, key, attr, text, display=True):
        element = self.__get_element_by_key_attr(key, attr, display)
        if element:
            element.send_keys(text)
            return True
        return False

    def check_checkbox_by_key(self, key, display=True):
        element = self.__get_element_by_xpath(
            str("//input[@id='%(key)s'][@type='checkbox']|"
                "//input[@name='%(key)s'][@type='checkbox']") % {'key': key},
            display)
        if element:
            if not element.is_selected():
                element.click()
            return True
        return False

    def uncheck_checkbox_by_key(self, key, display=True):
        element = self.__get_element_by_xpath(
            str("//input[@id='%(key)s'][@type='checkbox']|"
                "//input[@name='%(key)s'][@type='checkbox']") % {'key': key},
            display)
        if element:
            if element.is_selected():
                element.click()
            return True
        return False

    def get_alert_text(self):
        try:
            alert_element = self.driver.switch_to_alert()
            if alert_element:
                return alert_element.text
        except Exception as e:
            print "Failed to get alert text: %s" % e

        return None

    def check_alert_existing(self):
        try:
            self.driver.switch_to_alert().text
        except NoAlertPresentException:
            return False
        return True

    def accept_alert(self):
        try:
            alert_element = self.driver.switch_to_alert()
            alert_element.accept()
            return True
        except Exception as e:
            print "Failed to accept alert: %s" % e
            return False

    def quit(self):
        if self.driver:
            self.driver.quit()
Beispiel #2
0
class WebAPP(common.APP):

    def __init__(self, app_config=None, app_name=None):
        self.driver = None
        self.app_type = common.APP_TYPE_WEB
        self.app_name = app_name
        self.app_id = ""
        apk_activity_name = ""
        apk_pkg_name = ""
        if "platform" in app_config and "name" in app_config["platform"]:
            if app_config["platform"]["name"].upper().find('TIZEN') >= 0:
                self.app_id = tizen.get_appid_by_name(
                    self.app_name, app_config["platform"])
            if app_config["platform"]["name"].upper().find('ANDROID') >= 0:
                self.app_name = self.app_name.replace("-", "_")
                apk_name_update = "".join(
                    [i.capitalize() for i in self.app_name.split("_") if i])
                apk_activity_name = ".%sActivity" % apk_name_update
                apk_pkg_name = "org.xwalk.%s" % self.app_name
        app_config_str = json.dumps(app_config).replace(
            "TEST_APP_NAME", self.app_name).replace(
            "TEST_APP_ID", self.app_id).replace(
            "TEST_PKG_NAME", apk_pkg_name).replace(
            "TEST_ACTIVITY_NAME", apk_activity_name)
        self.app_config = json.loads(app_config_str)
        if "url-prefix" in app_config:
            self.url_prefix = app_config["url-prefix"]
        else:
            self.url_prefix = ""

    def __get_element_by_xpath(self, xpath, display=True):
        try:
            element = self.driver.find_element_by_xpath(xpath)
            if display:
                try:
                    if element.is_displayed():
                        return element
                except StaleElementReferenceException:
                    pass
            else:
                return element
            print "Failed to get element"
        except Exception as e:
            print "Failed to get element: %s" % e
        return None

    def __get_element_by_key_attr(self, key, attr, display=True):
        xpath = "//*[@%s='%s']" % (attr, key)
        try:
            element = self.driver.find_element_by_xpath(xpath)
            if display:
                try:
                    if element.is_displayed():
                        return element
                except StaleElementReferenceException:
                    pass
            else:
                return element
            print "Failed to get element"
        except Exception as e:
            print "Failed to get element: %s" % e
        return None

    def __get_element_by_tag(self, key, display=True):
        try:
            element = self.driver.find_element_by_tag(key)
            return element
        except Exception as e:
            print "Failed to get element: %s" % e
            return None

    def __get_element_by_key(self, key, display=True):
        try:
            for i_element in self.driver.find_elements_by_xpath(str(
                    "//*[@id='%(key)s']|"
                    "//*[@name='%(key)s']|"
                    "//*[@value='%(key)s']|"
                    "//*[contains(@class, '%(key)s')]|"
                    "//div[contains(text(), '%(key)s')]|"
                    "//button[contains(text(), '%(key)s')]|"
                    "//input[contains(text(), '%(key)s')]|"
                    "//textarea[contains(text(), '%(key)s')]|"
                    "//a[contains(text(), '%(key)s')]") % {'key': key}):
                if display:
                    try:
                        if i_element.is_displayed():
                            return i_element
                    except StaleElementReferenceException:
                        pass
                else:
                    return i_element
            print "Failed to get element"
        except Exception as e:
            print "Failed to get element: %s" % e
        return None

    def __get_element_by_keys(self, key_p, key_c, display=True):
        try:
            for i_element in self.driver.find_elements_by_xpath(str(
                    "//*[@id='%(key)s']|"
                    "//*[@name='%(key)s']|"
                    "//*[@value='%(key)s']|"
                    "//*[contains(@class, '%(key)s')]|"
                    "//div[contains(text(), '%(key)s')]|"
                    "//button[contains(text(), '%(key)s')]|"
                    "//input[contains(text(), '%(key)s')]|"
                    "//textarea[contains(text(), '%(key)s')]|"
                    "//a[contains(text(), '%(key)s')]") % {'key': key_p}):
                get_element = False
                if display:
                    try:
                        if i_element.is_displayed():
                            get_element = True
                    except StaleElementReferenceException:
                        pass
                else:
                    get_element = True

                if get_element:
                    print "%s ++ %s" % (i_element.get_attribute("id"), i_element.get_attribute("class"))
                    for ii_element in i_element.find_elements_by_xpath(str(
                            "./*[@id='%(key)s']|"
                            "./*[@name='%(key)s']|"
                            "./*[@value='%(key)s']|"
                            "./*[contains(@class, '%(key)s')]|"
                            "./div[contains(text(), '%(key)s')]|"
                            "./button[contains(text(), '%(key)s')]|"
                            "./input[contains(text(), '%(key)s')]|"
                            "./textarea[contains(text(), '%(key)s')]|"
                            "./a[contains(text(), '%(key)s')]") % {'key': key_c}):
                        if display:
                            try:
                                if ii_element.is_displayed():
                                    return ii_element
                            except StaleElementReferenceException:
                                pass
                        else:
                            return ii_element

            print "Failed to get element"
        except Exception as e:
            print "Failed to get element: %s" % e
        return None

    def __check_normal_text(self, text, display=True):
        try:
            for i_element in self.driver.find_elements_by_xpath(str(
                    '//*[@value="{text}"]|'
                    '//*[contains(normalize-space(.),"{text}") '
                    'and not(./*[contains(normalize-space(.),"{text}")])]'
                    .format(text=text))):
                if display:
                    try:
                        if i_element.is_displayed():
                            return i_element
                    except StaleElementReferenceException:
                        pass
                else:
                    return i_element
        except Exception as e:
            print "Failed to get element: %s" % e
        return None

    def __check_normal_text_element(self, text, key, display=True):
        element = self.__get_element_by_key(key, display)
        if element:
            try:
                for i_element in element.find_elements_by_xpath(str(
                        '//*[@value="{text}"]|'
                        '//*[contains(normalize-space(.),"{text}") '
                        'and not(./*[contains(normalize-space(.),"{text}")])]'
                        .format(text=text))):
                    if display:
                        try:
                            if i_element.is_displayed():
                                return i_element
                        except StaleElementReferenceException:
                            pass
                    else:
                        return i_element
            except Exception as e:
                print "Failed to get element: %s" % e
        return None

    def launch_app(self):
        try:
            desired_capabilities = self.app_config["desired-capabilities"]
            self.driver = WebDriver(
                str(self.app_config["driver-url"]), desired_capabilities)
        except Exception as e:
            print "Failed to launch %s: %s" % (self.app_name, e)
            return False
        return True

    def switch_url(self, url, with_prefix=True):
        if with_prefix:
            url = urljoin(self.url_prefix, url)
        try:
            self.driver.get(url)
        except Exception as e:
            print "Failed to visit %s: %s" % (url, e)
            return False
        return True

    def title(self):
        try:
            return self.driver.title
        except Exception as e:
            print "Failed to get title: %s" % e
            return None

    def current_url(self):
        try:
            return self.driver.current_url
        except Exception as e:
            print "Failed to get current url: %s" % e
            return None

    def reload(self):
        self.driver.refresh()
        return True

    def back(self):
        self.driver.back()
        return True

    def forward(self):
        self.driver.forward()
        return True

    def check_normal_text_timeout(self, text=None, display=True, timeout=2):
        end_time = time.time() + timeout
        while time.time() < end_time:
            if self.__check_normal_text(text, display):
                return True
            time.sleep(0.2)
        return False

    def check_normal_text_element_timeout(
            self, text=None, key=None, display=True, timeout=2):
        end_time = time.time() + timeout
        while time.time() < end_time:
            if self.__check_normal_text_element(text, key, display):
                return True
            time.sleep(0.2)
        return False

    def press_element_by_key(self, key, display=True):
        element = self.__get_element_by_key(key, display)
        print "%s == %s" % (element.get_attribute("id"), element.get_attribute("class"))
        if element:
            element.click()
            return True

        return False

    def press_element_by_keys(self, key_p, key_c, display=True):
        element = self.__get_element_by_keys(key_p, key_c, display)
        print "%s == %s" % (element.get_attribute("id"), element.get_attribute("class"))
        if element:
            element.click()
            return True

        return False

    def press_element_by_key_attr(self, key, attr, display=True):
        element = self.__get_element_by_key_attr(key, attr, display)
        print "%s == %s" % (element.get_attribute("id"), element.get_attribute("class"))
        if element:
            element.click()
            return True

        return False

    def click_element_by_keys(self, key_p, key_c, display=True):
        element = self.__get_element_by_keys(key_p, key_c, display)
        print "%s == %s" % (element.get_attribute("id"), element.get_attribute("class"))
        if element:
            ActionChains(self.driver).click(element).perform()
            return True
        return False

    def click_element_by_key(self, key, display=True):
        element = self.__get_element_by_key(key, display)
        print "%s == %s" % (element.get_attribute("id"), element.get_attribute("class"))
        if element:
            ActionChains(self.driver).click(element).perform()
            return True
        return False

    def click_element_coords(self, x, y, key, display=True):
        element = self.__get_element_by_key(key, display)
        if element:
            ActionChains(self.driver).move_to_element_with_offset(
                element, x, y).click().perform()
            return True
        return False

    def fill_element_by_key(self, key, text, display=True):
        element = self.__get_element_by_key(key, display)
        if element:
            element.send_keys(text)
            return True
        return False

    def check_checkbox_by_key(self, key, display=True):
        element = self.__get_element_by_xpath(str(
            "//input[@id='%(key)s'][@type='checkbox']|"
            "//input[@name='%(key)s'][@type='checkbox']") % {'key': key}, display)
        if element:
            if not element.is_selected():
                element.click()
            return True
        return False

    def uncheck_checkbox_by_key(self, key, display=True):
        element = self.__get_element_by_xpath(str(
            "//input[@id='%(key)s'][@type='checkbox']|"
            "//input[@name='%(key)s'][@type='checkbox']") % {'key': key}, display)
        if element:
            if element.is_selected():
                element.click()
            return True
        return False

    def get_alert_text(self):
        try:
            alert_element = self.driver.switch_to_alert()
            if alert_element:
                return alert_element.text
        except Exception as e:
            print "Failed to get alert text: %s" % e

        return None

    def check_alert_existing(self):
        try:
            self.driver.switch_to_alert().text
        except NoAlertPresentException:
            return False
        return True

    def accept_alert(self):
        try:
            alert_element = self.driver.switch_to_alert()
            alert_element.accept()
            return True
        except Exception as e:
            print "Failed to accept alert: %s" % e
            return False

    def quit(self):
        if self.driver:
            self.driver.quit()
Beispiel #3
0
class WebAPP(common.APP):

    def __init__(self, app_config=None, app_name=None,
                 apk_pkg_name=None, apk_activity_name=None):
        self.driver = None
        self.app_type = common.APP_TYPE_WEB
        self.app_name = app_name
        self.app_id = ""
        self.cur_path = os.getcwd()
        self.config_file = "data.conf"
        self.device_platform = ""
        self.test_type = ""
        self.read_config()
        self.test_url = app_config["test-url"]
        self.baseline_path = self.test_url + "/../../data/" + self.device_platform
        self.text_value = {}
        self.picture_list = []
        self.color_dict = {
            "rgb(255, 0, 0)": "red",
            "rgb(0, 255, 0)": "green",
            "rgb(0, 0, 255)": "blue",
            "rgb(255, 255, 0)": "yellow",
            "rgb(0, 0, 0)": "black",
            "rgb(0, 128, 0)": "green",
            "rgb(255, 255, 255)": "white",
            "rgba(0, 0, 0, 0)": "white"}
        apk_activity_name = apk_activity_name
        apk_pkg_name = apk_pkg_name
        if "platform" in app_config and "name" in app_config["platform"]:
            if app_config["platform"]["name"].upper().find('ANDROID') >= 0:
                if apk_activity_name == apk_pkg_name is None:
                    if "app_launcher" in app_config and app_config[
                            "app_launcher"] == "XWalkLauncher":
                        self.app_name = self.app_name.replace("-", "_")
                        apk_name_update = self.app_name.capitalize()
                        apk_activity_name = ".%sActivity" % apk_name_update
                        apk_pkg_name = "org.xwalk.%s" % self.app_name
                    if "app_launcher" in app_config and app_config[
                            "app_launcher"] == "CordovaLauncher":
                        self.app_name = self.app_name.replace("-", "_")
                        apk_activity_name = ".%s" % self.app_name
                        apk_pkg_name = "org.xwalk.%s" % self.app_name
                self.app_config_str = json.dumps(app_config).replace(
                    "TEST_APP_NAME", self.app_name).replace(
                    "TEST_APP_ID", self.app_id).replace(
                    "TEST_PKG_NAME", apk_pkg_name).replace(
                    "TEST_ACTIVITY_NAME", apk_activity_name)
            if app_config["platform"]["name"].upper().find('DEEPIN') >= 0:
                app_config.update({"desired-capabilities": {"loggingPrefs":{},"xwalkOptions": {"binary": "/usr/bin/TEST_BINARY", "debugPort": "12450"}}})
                self.app_config_str = json.dumps(app_config).replace("TEST_BINARY", self.app_name)
            if app_config["platform"]["name"].upper().find('WINDOWS') >= 0:
                self.app_config_str = json.dumps(app_config).replace("TEST_BINARY", self.app_name)
            self.app_config = json.loads(self.app_config_str)
        if "url-prefix" in app_config:
            self.url_prefix = app_config["url-prefix"]
        else:
            self.url_prefix = ""

    def read_config(self):
        try:
            config = ConfigParser.ConfigParser()
            with open(self.config_file, "r") as cfgfile:
                config.readfp(cfgfile)
            self.device_platform = config.get('info', 'platform')
            self.test_type = config.get('info', 'test_type')
        except Exception as e:
            print "Parser config data.config failed: %s" % e

    def __get_element_by_xpath(self, xpath, display=True):
        try:
            element = self.driver.find_element_by_xpath(xpath)
            if display:
                try:
                    if element.is_displayed():
                        return element
                except StaleElementReferenceException:
                    pass
            else:
                return element
            print "Failed to get element"
        except Exception as e:
            print "Failed to get element: %s" % e
        return None

    def __get_element_by_key_attr(self, key, attr, display=True):
        xpath = "//*[@%s='%s']" % (attr, key)
        try:
            element = self.driver.find_element_by_xpath(xpath)
            if display:
                try:
                    if element.is_displayed():
                        return element
                except StaleElementReferenceException:
                    pass
            else:
                return element
            print "Failed to get element"
        except Exception as e:
            print "Failed to get element: %s" % e
        return None

    def __get_element_by_tag(self, key, display=True):
        try:
            element = self.driver.find_element_by_tag(key)
            return element
        except Exception as e:
            print "Failed to get element: %s" % e
            return None

    def __get_element_by_key(self, key, display=True):
        try:
            for i_element in self.driver.find_elements_by_xpath(str(
                    "//*[@id='%(key)s']|"
                    "//*[@name='%(key)s']|"
                    "//*[@value='%(key)s']|"
                    "//*[contains(@class, '%(key)s')]|"
                    "//div[contains(text(), '%(key)s')]|"
                    "//button[contains(text(), '%(key)s')]|"
                    "//input[contains(text(), '%(key)s')]|"
                    "//textarea[contains(text(), '%(key)s')]|"
                    "//a[contains(text(), '%(key)s')]") % {'key': key}):
                if display:
                    try:
                        if i_element.is_displayed():
                            return i_element
                    except StaleElementReferenceException:
                        pass
                else:
                    return i_element
            print "Failed to get element"
        except Exception as e:
            print "Failed to get element: %s" % e
        return None

    def __get_element_by_keys(self, key_p, key_c, display=True):
        try:
            for i_element in self.driver.find_elements_by_xpath(str(
                    "//*[@id='%(key)s']|"
                    "//*[@name='%(key)s']|"
                    "//*[@value='%(key)s']|"
                    "//*[contains(@class, '%(key)s')]|"
                    "//div[contains(text(), '%(key)s')]|"
                    "//button[contains(text(), '%(key)s')]|"
                    "//input[contains(text(), '%(key)s')]|"
                    "//textarea[contains(text(), '%(key)s')]|"
                    "//a[contains(text(), '%(key)s')]") % {'key': key_p}):
                get_element = False
                if display:
                    try:
                        if i_element.is_displayed():
                            get_element = True
                    except StaleElementReferenceException:
                        pass
                else:
                    get_element = True

                if get_element:
                    print "%s ++ %s" % (i_element.get_attribute("id"), i_element.get_attribute("class"))
                    for ii_element in i_element.find_elements_by_xpath(str(
                            "./*[@id='%(key)s']|"
                            "./*[@name='%(key)s']|"
                            "./*[@value='%(key)s']|"
                            "./*[contains(@class, '%(key)s')]|"
                            "./div[contains(text(), '%(key)s')]|"
                            "./button[contains(text(), '%(key)s')]|"
                            "./input[contains(text(), '%(key)s')]|"
                            "./textarea[contains(text(), '%(key)s')]|"
                            "./a[contains(text(), '%(key)s')]") % {'key': key_c}):
                        if display:
                            try:
                                if ii_element.is_displayed():
                                    return ii_element
                            except StaleElementReferenceException:
                                pass
                        else:
                            return ii_element

            print "Failed to get element"
        except Exception as e:
            print "Failed to get element: %s" % e
        return None

    def __check_normal_text(self, text, display=True):
        try:
            for i_element in self.driver.find_elements_by_xpath(str(
                    '//*[@value="{text}"]|'
                    '//*[contains(normalize-space(.),"{text}") '
                    'and not(./*[contains(normalize-space(.),"{text}")])]'
                    .format(text=text))):
                if display:
                    try:
                        if i_element.is_displayed():
                            return i_element
                    except StaleElementReferenceException:
                        pass
                else:
                    return i_element
        except Exception as e:
            print "Failed to get element: %s" % e
        return None

    def check_normal_text_element_not_exist(self, text, key, display=True):
        element = self.__get_element_by_key(key, display)
        if element:
            try:
                e_list = element.find_elements_by_xpath(str(
                    '//*[@value="{text}"]|'
                    '//*[contains(normalize-space(.),"{text}") '
                    'and not(./*[contains(normalize-space(.),"{text}")])]'
                    .format(text=text)))
                for i_element in e_list:
                    if i_element.text == text:
                        return False
                return True
            except Exception as e:
                print "Failed to get element: %s" % e
        return False

    def __check_normal_text_element(self, text, key, display=True):
        element = self.__get_element_by_key(key, display)
        if element:
            try:
                for i_element in element.find_elements_by_xpath(str(
                        '//*[@value="{text}"]|'
                        '//*[contains(normalize-space(.),"{text}") '
                        'and not(./*[contains(normalize-space(.),"{text}")])]'
                        .format(text=text))):
                    if display:
                        try:
                            if i_element.is_displayed():
                                return i_element
                        except StaleElementReferenceException:
                            pass
                    else:
                        return i_element
            except Exception as e:
                print "Failed to get element: %s" % e
        return None

    def compare_two_values(self, first=None, second=None):
        try:
            if first.isdigit():
                if eval(first) < eval(self.text_value[second]):
                    return True
                else:
                    return False
            else:
                if eval(self.text_value[first]) < eval(self.text_value[second]):
                    return True
                else:
                    return False
        except Exception as e:
            print "Failed to compare these two param: %s" % e
        return False

    def judge_saved_value(self, value=None, result=None):
        try:
            if self.text_value[value] == result:
                return True
            else:
                return False
        except Exception as e:
            print "Failed to judge saved vaule: %s" % e
        return False

    def compare_two_values_range(self, first=None, second=None, value=None):
        try:
            result = eval(self.text_value[second]) - eval(self.text_value[first])
            if  result >= eval(value) :
                return True
            else:
                return False
        except Exception as e:
            print "Failed to compare these two param with value: %s" % e
        return False

    def judge_value_range(self, value=None, first=None, second=None):
        try:
            result = eval(self.text_value[value])
            if  (eval(second) >= result) and (eval(first) <= result) :
                return True
            elif  (eval(second) <= result) and (eval(first) >= result) :
                return True
            else:
                return False
        except Exception as e:
            print "Failed to judge value range: %s" % e
        return False

    def save_content(self, p_name=None, key=None):
        try:
            js_script = 'var style=document.getElementById(\"' + \
                key + '\").innerHTML; return style'
            style = self.driver.execute_script(js_script)
            self.text_value[p_name] = style
            return True
        except Exception as e:
            print "Failed to get element: %s" % e
            return False

    def launch_app(self):
        try:
            desired_capabilities = self.app_config["desired-capabilities"]
            if self.app_config["platform"]["name"] == "android":
                self.driver = WebDriver(
                    str(self.app_config["driver-url"]), desired_capabilities)
            elif self.app_config["platform"]["name"] in ("deepin", "windows"):
                self.driver = WebDriver(
                    str(self.app_config["driver-url"]), desired_capabilities, keep_alive=True)              
        except Exception as e:
            print "Failed to launch %s: %s" % (self.app_name, e)
            return False
        return True

    def switch_url(self, url, with_prefix=True):
        if with_prefix:
            url = urljoin(self.url_prefix, url)
        try:
            self.driver.get(url)
        except Exception as e:
            print "Failed to visit %s: %s" % (url, e)
            return False
        return True

    def title(self):
        try:
            return self.driver.title
        except Exception as e:
            print "Failed to get title: %s" % e
            return None

    def current_url(self):
        try:
            if isinstance(self.driver.current_url, dict):
                return self.driver.current_url['CurrentUrl']
            else:
                return self.driver.current_url
        except Exception as e:
            print "Failed to get current url: %s" % e
            return None

    def reload(self):
        self.driver.refresh()
        return True

    def back(self):
        self.driver.back()
        return True

    def forward(self):
        self.driver.forward()
        return True

    def check_normal_text_timeout(self, text=None, display=True, timeout=2):
        end_time = time.time() + timeout
        while time.time() < end_time:
            if self.__check_normal_text(text, display):
                return True
            time.sleep(0.2)
        return False

    def check_normal_title_timeout(self, text=None, display=True, timeout=2):
        end_time = time.time() + timeout
        while time.time() < end_time:
            if self.title() == text:
                return True
            time.sleep(0.2)
        return False

    def check_normal_text_element_timeout(
            self, text=None, key=None, display=True, timeout=2):
        end_time = time.time() + timeout
        while time.time() < end_time:
            if self.__check_normal_text_element(text, key, display):
                return True
            time.sleep(0.2)
        return False

    def check_normal_text_element_timeout_with_color(
            self, text=None, key=None, color=None, display=True, timeout=2):
        end_time = time.time() + timeout
        while time.time() < end_time:
            if self.__check_normal_text_element(text, key, display):
                if self.check_text_color(key, color):
                    return True
            time.sleep(0.2)
        return False

    def check_normal_element_timeout_with_color(
            self, key=None, color=None, display=True, timeout=2):
        end_time = time.time() + timeout
        while time.time() < end_time:
            if self.check_background_color(key, color):
                return True
            time.sleep(0.2)
        return False

    def check_background_color(self, key=None, color=None, display=True):
        try:
            js_script = 'var bg_color=document.getElementById(\"' + \
                key + '\").style.backgroundColor; return bg_color'
            bg_color = self.driver.execute_script(js_script)
            if not bg_color:
                js_script = 'var element=document.getElementById(\"' + key + '\");' \
                    ' if(element.currentStyle) {return element.currentStyle.backgroundColor;} ' \
                    ' else { return  document.defaultView.getComputedStyle(element,null).backgroundColor; } '
                bg_color = self.driver.execute_script(js_script)
            if not bg_color:
                bg_color = "white"
            number = re.match(r'[A-Za-z]+$', bg_color)
            if not number:
                bg_color = self.color_dict[bg_color]
            if bg_color.strip() == color:
                return True
        except Exception as e:
            print "Failed to get element color: %s" % e
        return False

    def check_text_color(self, key=None, color=None, display=True):
        try:
            js_script = 'var text_color=document.getElementById(\"' + \
                key + '\").style.color; return text_color'
            text_color = self.driver.execute_script(js_script)
            if not text_color:
                js_script = 'var element=document.getElementById(\"' + key + '\");' \
                    ' if(element.currentStyle) {return element.currentStyle.color;} ' \
                    ' else { return  document.defaultView.getComputedStyle(element,null).color; } '
                text_color = self.driver.execute_script(js_script)
            if not text_color:
                text_color = "black"
            is_rgb = re.match(r'[A-Za-z]+$', text_color)
            if not is_rgb:
                text_color = self.color_dict[text_color]
            if text_color.strip() == color:
                return True
        except Exception as e:
            print "Failed to get element: %s" % e
        return False

    def check_content_type(self, key=None, display=True):
        try:
            js_script = 'var text=document.getElementById(\"' + \
                key + '\").innerText; return text'
            text = self.driver.execute_script(js_script)
            if text.strip() == '':
                return 'none'
            number = re.match(r'(-?\d+)(\.\d+)?', text)
            if number:
                if "." in text:
                    return "float"
                else:
                    return "int"
            else:
                if text.upper() == "TRUE" or text.upper() == "FALSE":
                    return "boolean"
                else:
                    return "string"
        except Exception as e:
            print "Failed to get element text: %s" % e

    def should_see_text_startswith(self, text=None, key=None):
        try:
            js_script = 'var text=document.getElementById(\"' + \
                key + '\").innerHTML; return text'
            content = self.driver.execute_script(js_script)
            if content.strip().startswith(text):
                return True
            else:
                return False
        except Exception as e:
            print "Failed to find text startswith %s" % text
            return False

    def should_see_text_endswith(self, text=None, key=None):
        try:
            js_script = 'var text=document.getElementById(\"' + \
                key + '\").innerHTML; return text'
            content = self.driver.execute_script(js_script)
            if content.strip().endswith(text):
                return True
            else:
                return False
        except Exception as e:
            print "Failed to find text endswith %s" % text
            return False

    def press_element_by_key(self, key, display=True):
        element = self.__get_element_by_key(key, display)
        print "%s == %s" % (element.get_attribute("id"), element.get_attribute("class"))
        if element:
            element.click()
            return True

        return False

    def press_element_by_keys(self, key_p, key_c, display=True):
        element = self.__get_element_by_keys(key_p, key_c, display)
        print "%s == %s" % (element.get_attribute("id"), element.get_attribute("class"))
        if element:
            element.click()
            return True

        return False

    def press_element_by_key_attr(self, key, attr, display=True):
        element = self.__get_element_by_key_attr(key, attr, display)
        print "%s == %s" % (element.get_attribute("id"), element.get_attribute("class"))
        if element:
            element.click()
            return True

        return False

    def click_element_by_keys(self, key_p, key_c, display=True):
        element = self.__get_element_by_keys(key_p, key_c, display)
        print "%s == %s" % (element.get_attribute("id"), element.get_attribute("class"))
        if element:
            ActionChains(self.driver).click(element).perform()
            return True
        return False

    def click_element_by_key(self, key, display=True):
        element = self.__get_element_by_key(key, display)
        if element:
            print "%s == %s" % (element.get_attribute("id"), element.get_attribute("class"))
            if self.app_config["platform"]["name"].upper() == "WINDOWS":
                element.click()
            else:
                ActionChains(self.driver).click(element).perform()
            return True
        return False

# * The method click_element_by_key will fail when VKB shelter the button, and js can avoid this issue.
    def click_element_by_id_with_js(self, key, display=True):
        element = self.__get_element_by_key_attr(key, "id", display)
        print "%s == %s" % (element.get_attribute("id"), element.get_attribute("class"))
        if element:
            js_script = 'document.getElementById(\"' + key + '\").click()'
            self.driver.execute_script(js_script)
            return True
        return False

    def click_element_coords(self, x, y, key, display=True):
        element = self.__get_element_by_key(key, display)
        if element:
            ActionChains(self.driver).move_to_element_with_offset(
                element, x, y).click().perform()
            return True
        return False

    def execute_js_code(self, js_code):
        try:
            return self.driver.execute_script(js_code)
        except Exception as e:
            print "Execute js code failed: %s" % e
            return 0

    # Calculate the location params of element
    def calculate_element_location(self, key, width=0, height=0):
        try:
            if width:
                width = string.atoi(width)
            if height:
                height = string.atoi(height)
            js_script = 'var top=document.getElementById(\"' + \
                key + '\").getBoundingClientRect().top;  return top'
            top = self.execute_js_code(js_script)
            js_script = 'var left=document.getElementById(\"' + \
                key + '\").getBoundingClientRect().left; return left'
            left = self.execute_js_code(js_script)
            if not width:
                js_script = 'var width=document.getElementById(\"' + \
                    key + '\").getBoundingClientRect().width; return width'
                width = self.execute_js_code(js_script)
            if not height:
                js_script = 'var height=document.getElementById(\"' + \
                    key + '\").getBoundingClientRect().height; return height'
                height = self.execute_js_code(js_script)
            return (left, top, left + width, top + height)
        except Exception as e:
            print "Get element location failed: %s" % e
            return 0

    def calculate_resolution_ratio(self, pic_name):
        try:
            js_script = 'var width=window.screen.availWidth; return width'
            body_width = self.execute_js_code(js_script)
            js_script = 'var height=window.screen.availHeight; return height'
            body_height = self.execute_js_code(js_script)
            im = Image.open(pic_name)
            w, h = im.size
            ratio_w = w / body_width
            ratio_h = h / body_height
            ration = 0
            if ratio_w > ratio_h:
                ratio = ratio_w
            else:
                ratio = ratio_h
            return w / ratio, h / ratio
        except Exception as e:
            print "Calculate page picture resolution failed: %s" % e
            return 0

    # Save the specified element as a single picture
    def save_div_as_picture(self, key, element_pic, width=0, height=0):
        try:
            page_pic = "page.png"
            self.driver.get_screenshot_as_file(page_pic)
            self.picture_list.append(page_pic)
            ratio = self.calculate_resolution_ratio(page_pic)
            self.convert_pic(page_pic, ratio)
            box = self.calculate_element_location(key, width, height)
            self.crop_pic(page_pic, element_pic, box)
            self.picture_list.append(element_pic)
            return True
        except Exception as e:
            print "Save element picture failed: %s" % e
            return False

    # Remove these temporary pictures
    def remove_picture(self):
        try:
            picture_list = list(set(self.picture_list))
            for element in picture_list:
                os.remove(element)
            self.picture_list = []
            return True
        except Exception as e:
            print "Remove the tmp pictures fail: %s" % e
            return False

    # Check if 2 files content are the same
    def check_md5_file_same(self, file_name):
        try:
            if self.test_type == "result":
                result_path = self.baseline_path + "/" + file_name + ".md5"
                fp_result = open(result_path, "r")
                str_result = fp_result.read()
                fp_result.close()
                baseline_path = self.baseline_path + \
                    "/" + file_name + "_baseline.md5"
                fp_baseline = open(baseline_path, "r")
                str_baseline = fp_baseline.read()
                fp_baseline.close()
                index = cmp(str_result, str_baseline)
                if not index:
                    return True
                else:
                    return False
            elif self.test_type == "baseline":
                return True
        except Exception as e:
            print "Check md5 file failed: %s" % e
            return False

    # Save pic as base64 data's md5
    def save_base64_md5_pic(self, pic_name):
        try:
            md5file_path = ""
            if self.test_type == "result":
                md5file_path = self.baseline_path + "/" + pic_name + ".md5"
            elif self.test_type == "baseline":
                md5file_path = self.baseline_path + \
                    "/" + pic_name + "_baseline.md5"
            pic_base64 = self.driver.get_screenshot_as_base64()
            pic_md5 = self.get_string_md5(pic_base64)
            fp = open(md5file_path, "w")
            fp.write(pic_md5)
            fp.close()
            return True
        except Exception as e:
            print "Save pic as base64 failed: %s" % e
            return False

    # Save page as pictures
    def save_page_per_conf(self, pic_name):
        try:
            if not os.path.exists(self.baseline_path):
                os.makedirs(self.baseline_path)
            if self.test_type == "result":
                picname_result = self.baseline_path + "/" + pic_name + ".png"
                self.driver.get_screenshot_as_file(picname_result)
                return True
            elif self.test_type == "baseline":
                picname_baseline = self.baseline_path + \
                    "/" + pic_name + "_baseline.png"
                self.driver.get_screenshot_as_file(picname_baseline)
                return True
            else:
                print "Test_type is wrong. It should be baseline or result. Please check the data.config file."
                return False
        except Exception as e:
            print "Save baseline pictures fail: %s" % e
            return False

    def check_base_result_similarity(self, pic_name, similarity):
        resu_pic = self.baseline_path + "/" + pic_name + ".png"
        base_pic = self.baseline_path + "/" + pic_name + "_baseline.png"
        if not os.path.exists(resu_pic):
            print "The result picture %s is not existed! Case fail" % pic_name
            return False
        if not os.path.exists(base_pic):
            print "The baseline picture %s is not existed! Case fail" % base_pic
            return False
        return self.check_pic_same(base_pic, resu_pic, similarity)

    def fill_element_by_key(self, key, text, display=True):
        element = self.__get_element_by_key(key, display)
        if element:
            element.send_keys(text)
            return True
        return False

    def fill_element_by_key_attr(self, key, attr, text, display=True):
        element = self.__get_element_by_key_attr(key, attr, display)
        if element:
            element.send_keys(text)
            return True
        return False

    def check_checkbox_by_key(self, key, display=True):
        element = self.__get_element_by_xpath(str(
            "//input[@id='%(key)s'][@type='checkbox']|"
            "//input[@name='%(key)s'][@type='checkbox']") % {'key': key}, display)
        if element:
            if not element.is_selected():
                element.click()
            return True
        return False

    def uncheck_checkbox_by_key(self, key, display=True):
        element = self.__get_element_by_xpath(str(
            "//input[@id='%(key)s'][@type='checkbox']|"
            "//input[@name='%(key)s'][@type='checkbox']") % {'key': key}, display)
        if element:
            if element.is_selected():
                element.click()
            return True
        return False

    def get_alert_text(self):
        try:
            alert_element = self.driver.switch_to_alert()
            if alert_element:
                return alert_element.text
        except Exception as e:
            print "Failed to get alert text: %s" % e

        return None

    def check_alert_existing(self):
        try:
            self.driver.switch_to_alert().text
        except NoAlertPresentException:
            return False
        return True

    def accept_alert(self):
        try:
            alert_element = self.driver.switch_to_alert()
            alert_element.accept()
            return True
        except Exception as e:
            print "Failed to accept alert: %s" % e
            return False

    def quit(self):
        if self.driver:
            self.driver.quit()
Beispiel #4
0
class WebAPP(common.APP):
    def __init__(self, app_config=None, app_name=None):
        self.__driver = None
        self.app_type = common.APP_TYPE_WEB
        self.app_name = app_name
        self.app_id = ""
        apk_activity_name = ""
        apk_pkg_name = ""
        if "platform" in app_config and "name" in app_config["platform"]:
            if app_config["platform"]["name"].upper().find('TIZEN') >= 0:
                app_id = tizen.get_appid_by_name(self.app_name,
                                                 app_config["platform"])
            if app_config["platform"]["name"].upper().find('ANDROID') >= 0:
                self.app_name = self.app_name.replace("-", "_")
                apk_name_update = "".join(
                    [i.capitalize() for i in self.app_name.split("_") if i])
                apk_activity_name = ".%sActivity" % apk_name_update
                apk_pkg_name = "org.xwalk.%s" % self.app_name
        app_config_str = json.dumps(app_config).replace(
            "TEST_APP_NAME",
            self.app_name).replace("TEST_APP_ID", self.app_id).replace(
                "TEST_PKG_NAME", apk_pkg_name).replace("TEST_ACTIVITY_NAME",
                                                       apk_activity_name)
        self.app_config = json.loads(app_config_str)
        if "url-prefix" in app_config:
            self.url_prefix = app_config["url-prefix"]
        else:
            self.url_prefix = ""

    def __get_element_by_xpath(self, xpath, display=True):
        try:
            element = self.__driver.find_element_by_xpath(xpath)
            if display:
                try:
                    if element.is_displayed():
                        return element
                except StaleElementReferenceException:
                    pass
            else:
                return element
            print "Failed to get element"
        except Exception as e:
            print "Failed to get element: %s" % e
        return None

    def __get_element_by_tag(self, key, display=True):
        try:
            element = self.__driver.find_element_by_tag(key)
            return element
        except Exception as e:
            print "Failed to get element: %s" % e
            return None

    def __get_element_by_key(self, key, display=True):
        try:
            for i_element in self.__driver.find_elements_by_xpath(
                    str("//*[@id='%(key)s']|"
                        "//*[@name='%(key)s']|"
                        "//*[@value='%(key)s']|"
                        "//*[contains(@class, '%(key)s')]|"
                        "//button[contains(text(), '%(key)s')]|"
                        "//input[contains(text(), '%(key)s')]|"
                        "//textarea[contains(text(), '%(key)s')]|"
                        "//a[contains(text(), '%(key)s')]") % {'key': key}):
                if display:
                    try:
                        if i_element.is_displayed():
                            return i_element
                    except StaleElementReferenceException:
                        pass
                else:
                    return i_element
            print "Failed to get element"
        except Exception as e:
            print "Failed to get element: %s" % e
        return None

    def __check_normal_text(self, text, display=True):
        try:
            for i_element in self.__driver.find_elements_by_xpath(
                    str('//*[contains(normalize-space(.),"{text}") '
                        'and not(./*[contains(normalize-space(.),"{text}")])]'.
                        format(text=text))):
                if display:
                    try:
                        if i_element.is_displayed():
                            return i_element
                    except StaleElementReferenceException:
                        pass
                else:
                    return i_element
        except Exception as e:
            print "Failed to get element: %s" % e
        return None

    def __check_normal_text_element(self, text, key, display=True):
        element = self.__get_element_by_key(key, display)
        if element:
            try:
                for i_element in element.find_elements_by_xpath(
                        str('//*[contains(normalize-space(.),"{text}") '
                            'and not(./*[contains(normalize-space(.),"{text}")])]'
                            .format(text=text))):
                    if display:
                        try:
                            if i_element.is_displayed():
                                return i_element
                        except StaleElementReferenceException:
                            pass
                    else:
                        return i_element
            except Exception as e:
                print "Failed to get element: %s" % e
        return None

    def launch_app(self):
        try:
            desired_capabilities = self.app_config["desired-capabilities"]
            self.__driver = WebDriver(str(self.app_config["driver-url"]),
                                      desired_capabilities)
        except Exception as e:
            print "Failed to launch %s: %s" % (self.app_name, e)
            return False
        return True

    def switch_url(self, url, with_prefix=True):
        if with_prefix:
            url = urljoin(self.url_prefix, url)
        try:
            self.__driver.get(url)
        except Exception as e:
            print "Failed to visit %s: %s" % (url, e)
            return False
        return True

    def title(self):
        try:
            return self.__driver.title
        except Exception as e:
            print "Failed to get title: %s" % e
            return None

    def current_url(self):
        try:
            return self.__driver.current_url
        except Exception as e:
            print "Failed to get current url: %s" % e
            return None

    def reload(self):
        self.__driver.refresh()
        return True

    def back(self):
        self.__driver.back()
        return True

    def forward(self):
        self.__driver.forward()
        return True

    def check_normal_text_timeout(self, text=None, display=True, timeout=2):
        end_time = time.time() + timeout
        while time.time() < end_time:
            if self.__check_normal_text(text, display):
                return True
            time.sleep(0.2)
        return False

    def check_normal_text_element_timeout(self,
                                          text=None,
                                          key=None,
                                          display=True,
                                          timeout=2):
        end_time = time.time() + timeout
        while time.time() < end_time:
            if self.__check_normal_text_element(text, key, display):
                return True
            time.sleep(0.2)
        return False

    def press_element_by_key(self, key, display=True):
        element = self.__get_element_by_key(key, display)
        if element:
            element.click()
            return True

        return False

    def click_element_by_key(self, key, display=True):
        element = self.__get_element_by_key(key, display)
        if element:
            ActionChains(self.__driver).click(element).perform()
            return True
        return False

    def click_element_coords(self, x, y, key, display=True):
        element = self.__get_element_by_key(key, display)
        if element:
            ActionChains(self.__driver).move_to_element_with_offset(
                element, x, y).click().perform()
            return True
        return False

    def fill_element_by_key(self, key, text, display=True):
        element = self.__get_element_by_key(key, display)
        if element:
            element.send_keys(text)
            return True
        return False

    def check_checkbox_by_key(self, key, display=True):
        element = self.__get_element_by_xpath(
            str("//input[@id='%(key)s'][@type='checkbox']|"
                "//input[@name='%(key)s'][@type='checkbox']") % {'key': key},
            display)
        if element:
            if not element.is_selected():
                element.click()
            return True
        return False

    def uncheck_checkbox_by_key(self, key, display=True):
        element = self.__get_element_by_xpath(
            str("//input[@id='%(key)s'][@type='checkbox']|"
                "//input[@name='%(key)s'][@type='checkbox']") % {'key': key},
            display)
        if element:
            if element.is_selected():
                element.click()
            return True
        return False

    def get_alert_text(self):
        try:
            alert_element = self.__driver.switch_to_alert()
            if alert_element:
                return alert_element.text
        except Exception as e:
            print "Failed to get alert text: %s" % e

        return None

    def check_alert_existing(self):
        try:
            self.__driver.switch_to_alert().text
        except NoAlertPresentException:
            return False
        return True

    def accept_alert(self):
        try:
            alert_element = self.__driver.switch_to_alert()
            alert_element.accept()
            return True
        except Exception as e:
            print "Failed to accept alert: %s" % e
            return False

    def quit(self):
        if self.__driver:
            self.__driver.quit()
Beispiel #5
0
def roulette(save_dir: str, driver: WebDriver, wait: WebDriverWait):
    """ ルーレット """
    url = 'https://s.amebame.com/#gacha/roulette/lp'
    success = True

    # プレイ回数を決める
    count = 1
    loop_count = 1

    driver.get(url)

    # URLが一度リダイレクトするため、それらが終わるのを待つ
    try:
        wait.until(lambda driver: driver.current_url != url)
        wait.until(lambda driver: driver.current_url != AMEBA_URL)
    except:
        # タイムアウトになったのでURL遷移できているものとみなす
        pass

    try:
        # "roulette_img" > img のファイルパスを見て実行回数を決める
        image = driver.find_element_by_css_selector('.roulette_img img')
        src = image.get_attribute("src")
        if src.endswith("-x3.png"):
            utils.LOGGER.info("3回実施")
            count = 3
        elif src.endswith("-x2.png"):
            utils.LOGGER.info("2回実施")
            count = 2

        while loop_count <= count:
            button_locator = '.gacha_button'
            start = driver.find_element_by_css_selector(button_locator)
            wait.until(ec.element_to_be_clickable(
                (By.CSS_SELECTOR, button_locator)))

            # フッターで要素が隠れるため、少し下の要素へ移動してからボタンを押す
            start.click()

            # URLが結果画面になるのを待つ
            wait.until(lambda driver: driver.current_url != url)

            # 結果が出るのを待つ
            # はずれ:// *[@id="gacha"] / div[1] / img
            # あたり:// *[@id=\"gacha\"] / div[1] / div[1] / img
            wait.until(ec.visibility_of_element_located(
                (By.CSS_SELECTOR, '#gacha > div.roulette_result img')))

            driver.save_screenshot(
                '%s/roulette_%d_%s.png' % (save_dir, loop_count, datetime.datetime.now().strftime('%Y%m%d%H%M%S')))

            loop_count += 1

            if loop_count <= count:
                # 3秒待つ
                time.sleep(3)
                # 戻ってページ再読み込み
                driver.back()
                wait.until(ec.url_to_be(url))
                driver.refresh()
    except:
        utils.LOGGER.exception('ルーレットプレイエラー')
        success = False

    # 最終結果
    RESULTS.roulette = {
        'count': count,
        'success': success,
    }
Beispiel #6
0
class TestSelenium:

    driver = None
    sample_page = None

    @classmethod
    def setup_class(cls):
        """
        Remove previous saved screenshots
        :return:
        """
        if os.path.exists(DIR):
            shutil.rmtree(DIR)
        os.mkdir(DIR)

    def setup_method(self):
        config = LoadConfig()
        selenium_hub = config.get_value(SELENIUM_HUB)
        browser = config.get_value(BROWSER).upper()
        self.driver = WebDriver(
            command_executor=f'http://{selenium_hub}/wd/hub',
            desired_capabilities=getattr(DesiredCapabilities, browser).copy())
        self.driver.get('http://store.demoqa.com')
        self.navigate_to_page(SAMPLE_PAGE)
        self.sample_page = SamplePage(self.driver)

    def teardown_method(self):
        # You cannot close Firefox and quit it after, or close or quit, not both.
        # self.driver.close()
        self.driver.quit()
        self.driver = None
        self.sample_page = None

    def navigate_to_page(self, link_text):
        """
        Search for the first link that has test described in :param link_text:
        :param link_text: String
        :return:
        """
        self.driver.find_element_by_link_text(link_text).click()
        self.driver.save_screenshot(f'{DIR}/{link_text}.png')

    @staticmethod
    def generate_string(size):
        # TODO I don't like how this string is generated
        text = TextGenerator()
        text.generate_dictionary(size)
        return ' '.join(map(str, text.get_dictionary()))

    def test_wrong_email_redirects_error_page(self, request):
        """
        Writes a comment with wrong email, saves a screenshot.
        Checks that error messages appears.
        :param request: pytest fixture with built in methods
        :return:
        """
        # when
        comment = self.generate_string(100)
        self.sample_page.write_comment(comment, NAME, WRONG_EMAIL)
        self.driver.save_screenshot(f'{DIR}/{request.node.name}.png')

        # then
        error = self.driver.find_element_by_id(ERROR_MESSAGE_ID)
        assert ERROR_MESSAGE in error.text

    def test_correct_email_adds_comment(self, request):
        """
        Writes a comment with correct email, saves a screenshot.
        Checks that comment was inserted and it has the correct value.
        :param request: pytest fixture with built in methods
        :return:
        """
        # when
        comment = self.generate_string(100)
        self.sample_page.write_comment(comment, NAME, CORRECT_EMAIL)

        # then
        # TODO self.driver.current_url works, but is a bit out of context, maybe it should be returned by .write_comment
        comment_found = self.sample_page.get_comment(self.driver.current_url)
        self.driver.save_screenshot(f'{DIR}/{request.node.name}.png')

        assert comment_found is not None
        assert comment == comment_found.find_element_by_class_name(
            COMMENT_BODY_ID).text

    def test_of_the_gods(self, request):
        """
        Does everything, writes a comment with wrong email, checks that error messages appears, goes back,
        writes a new comment with correct email, saves a screenshot, checks that comment was inserted and it
        has the correct value.
        :param request: pytest fixture with built in methods
        :return:
        """
        # when
        self.sample_page.write_comment(self.generate_string(100), NAME,
                                       WRONG_EMAIL)

        # then
        error = self.driver.find_element_by_id(ERROR_MESSAGE_ID)
        assert ERROR_MESSAGE in error.text

        # Navigate to Sample Page
        self.driver.back()

        # when
        # Chrome keeps values previously typed
        self.sample_page.clear_fields()
        comment = self.generate_string(100)
        self.sample_page.write_comment(comment, NAME, CORRECT_EMAIL)

        # TODO self.driver.current_url works, but is a bit out of context, maybe it should be returned by .write_comment
        comment_found = self.sample_page.get_comment(self.driver.current_url)
        self.driver.save_screenshot(f'{DIR}/{request.node.name}.png')

        assert comment_found is not None
        assert comment_found.find_element_by_class_name(
            COMMENT_BODY_ID).text == comment
def _visit_subpages(url: str, num_links: int, webdriver: WebDriver,
                    seen_links: set, subpage_timeout: float, browser_params):
    """
    Originally split off from the browse command to support recursion.
    However this was later removed.

    Visits num_links subpages on the index, gathered from hrefs.
    """
    fully_loaded = wait_until_loaded(webdriver,
                                     timeout=subpage_timeout,
                                     period=0.5)
    if not fully_loaded:
        logger.warning(
            "BROWSER %i: Subpage was slow and failed to load fully. "
            "Continuing anyways..." % browser_params['browser_id'])

    for _ in range(num_links):
        try:
            links = [
                x for x in get_intra_links(webdriver, url)
                if is_displayed(x) is True
            ]
            if not links:
                break
            r = int(random.random() * len(links))
            link_url = links[r].get_attribute("href")
            if link_url in seen_links:
                logger.info("BROWSER %i: skipping internal link %s" %
                            (browser_params['browser_id'], link_url))
                continue

            logger.info("BROWSER %i: visiting internal link %s" %
                        (browser_params['browser_id'], link_url))
            seen_links.add(link_url)

            try:
                links[r].click()
                fully_loaded = wait_until_loaded(webdriver,
                                                 timeout=subpage_timeout,
                                                 period=0.5)
                if not fully_loaded:
                    logger.warning(
                        "BROWSER %i: Subpage was slow and failed to load fully. "
                        "Continuing anyways..." % browser_params['browser_id'])

                # dismiss any pending alerts
                try:
                    alert = webdriver.switch_to.alert()
                    alert.dismiss()
                except NoAlertPresentException:
                    pass

                # scroll to bottom to ensure all cookies are loaded
                scroll_to_bottom(webdriver)

                # move back to previous page
                webdriver.back()
                fully_loaded = wait_until_loaded(webdriver,
                                                 timeout=subpage_timeout,
                                                 period=0.5)
                if not fully_loaded:
                    logger.warning(
                        "BROWSER %i: Returning from subpage was slow and failed to load fully. "
                        "Continuing anyways..." % browser_params['browser_id'])
            except Exception:
                pass
        except StaleElementReferenceException:
            logger.warning(
                "BROWSER %i: Link turned stale, trying another link." %
                browser_params['browser_id'])
            continue
Beispiel #8
0
class WebAPP(common.APP):

    def __init__(self, app_config=None, app_name=None, apk_pkg_name=None, apk_activity_name=None):
        self.driver = None
        self.app_type = common.APP_TYPE_WEB
        self.app_name = app_name
        self.app_id = ""
        self.text_value = {}
        self.color_dict = {"rgb(255, 0, 0)": "red","rgb(0, 255, 0)": "green","rgb(0, 0, 255)": "blue","rgb(255, 255, 0)": "yellow","rgb(0, 0, 0)": "black","rgb(0, 128, 0)": "green","rgb(255, 255, 255)": "white","rgba(0, 0, 0, 0)": "white"}
        apk_activity_name = apk_activity_name
        apk_pkg_name = apk_pkg_name
        if "platform" in app_config and "name" in app_config["platform"]:
            if app_config["platform"]["name"].upper().find('TIZEN') >= 0:
                self.app_id = tizen.get_appid_by_name(
                    self.app_name, app_config["platform"], app_config["tizen_user"])
            if app_config["platform"]["name"].upper().find('ANDROID') >= 0:
                if apk_activity_name == apk_pkg_name == None:
                    if "app_launcher" in app_config and app_config["app_launcher"] == "XWalkLauncher":
                        self.app_name = self.app_name.replace("-", "_")
                        apk_name_update = "".join(
                            [i.capitalize() for i in self.app_name.split("_") if i])
                        apk_activity_name = ".%sActivity" % apk_name_update
                        apk_pkg_name = "org.xwalk.%s" % self.app_name
                    if "app_launcher" in app_config and app_config["app_launcher"] == "CordovaLauncher":
                        self.app_name = self.app_name.replace("-", "_")
                        apk_activity_name = ".%s" % self.app_name
                        apk_pkg_name = "org.xwalk.%s" % self.app_name
        app_config_str = json.dumps(app_config).replace(
            "TEST_APP_NAME", self.app_name).replace(
            "TEST_APP_ID", self.app_id).replace(
            "TEST_PKG_NAME", apk_pkg_name).replace(
            "TEST_ACTIVITY_NAME", apk_activity_name)
        self.app_config = json.loads(app_config_str)
        if "url-prefix" in app_config:
            self.url_prefix = app_config["url-prefix"]
        else:
            self.url_prefix = ""

    def __get_element_by_xpath(self, xpath, display=True):
        try:
            element = self.driver.find_element_by_xpath(xpath)
            if display:
                try:
                    if element.is_displayed():
                        return element
                except StaleElementReferenceException:
                    pass
            else:
                return element
            print "Failed to get element"
        except Exception as e:
            print "Failed to get element: %s" % e
        return None

    def __get_element_by_key_attr(self, key, attr, display=True):
        xpath = "//*[@%s='%s']" % (attr, key)
        try:
            element = self.driver.find_element_by_xpath(xpath)
            if display:
                try:
                    if element.is_displayed():
                        return element
                except StaleElementReferenceException:
                    pass
            else:
                return element
            print "Failed to get element"
        except Exception as e:
            print "Failed to get element: %s" % e
        return None

    def __get_element_by_tag(self, key, display=True):
        try:
            element = self.driver.find_element_by_tag(key)
            return element
        except Exception as e:
            print "Failed to get element: %s" % e
            return None

    def __get_element_by_key(self, key, display=True):
        try:
            for i_element in self.driver.find_elements_by_xpath(str(
                    "//*[@id='%(key)s']|"
                    "//*[@name='%(key)s']|"
                    "//*[@value='%(key)s']|"
                    "//*[contains(@class, '%(key)s')]|"
                    "//div[contains(text(), '%(key)s')]|"
                    "//button[contains(text(), '%(key)s')]|"
                    "//input[contains(text(), '%(key)s')]|"
                    "//textarea[contains(text(), '%(key)s')]|"
                    "//a[contains(text(), '%(key)s')]") % {'key': key}):
                if display:
                    try:
                        if i_element.is_displayed():
                            return i_element
                    except StaleElementReferenceException:
                        pass
                else:
                    return i_element
            print "Failed to get element"
        except Exception as e:
            print "Failed to get element: %s" % e
        return None

    def __get_element_by_keys(self, key_p, key_c, display=True):
        try:
            for i_element in self.driver.find_elements_by_xpath(str(
                    "//*[@id='%(key)s']|"
                    "//*[@name='%(key)s']|"
                    "//*[@value='%(key)s']|"
                    "//*[contains(@class, '%(key)s')]|"
                    "//div[contains(text(), '%(key)s')]|"
                    "//button[contains(text(), '%(key)s')]|"
                    "//input[contains(text(), '%(key)s')]|"
                    "//textarea[contains(text(), '%(key)s')]|"
                    "//a[contains(text(), '%(key)s')]") % {'key': key_p}):
                get_element = False
                if display:
                    try:
                        if i_element.is_displayed():
                            get_element = True
                    except StaleElementReferenceException:
                        pass
                else:
                    get_element = True

                if get_element:
                    print "%s ++ %s" % (i_element.get_attribute("id"), i_element.get_attribute("class"))
                    for ii_element in i_element.find_elements_by_xpath(str(
                            "./*[@id='%(key)s']|"
                            "./*[@name='%(key)s']|"
                            "./*[@value='%(key)s']|"
                            "./*[contains(@class, '%(key)s')]|"
                            "./div[contains(text(), '%(key)s')]|"
                            "./button[contains(text(), '%(key)s')]|"
                            "./input[contains(text(), '%(key)s')]|"
                            "./textarea[contains(text(), '%(key)s')]|"
                            "./a[contains(text(), '%(key)s')]") % {'key': key_c}):
                        if display:
                            try:
                                if ii_element.is_displayed():
                                    return ii_element
                            except StaleElementReferenceException:
                                pass
                        else:
                            return ii_element

            print "Failed to get element"
        except Exception as e:
            print "Failed to get element: %s" % e
        return None

    def __check_normal_text(self, text, display=True):
        try:
            for i_element in self.driver.find_elements_by_xpath(str(
                    '//*[@value="{text}"]|'
                    '//*[contains(normalize-space(.),"{text}") '
                    'and not(./*[contains(normalize-space(.),"{text}")])]'
                    .format(text=text))):
                if display:
                    try:
                        if i_element.is_displayed():
                            return i_element
                    except StaleElementReferenceException:
                        pass
                else:
                    return i_element
        except Exception as e:
            print "Failed to get element: %s" % e
        return None

    def check_normal_text_element_not_exist(self, text, key, display=True):
        element = self.__get_element_by_key(key, display)
        if element:
            try:
                e_list = element.find_elements_by_xpath(str(
                        '//*[@value="{text}"]|'
                        '//*[contains(normalize-space(.),"{text}") '
                        'and not(./*[contains(normalize-space(.),"{text}")])]'
                        .format(text=text)))
                for i_element in e_list:
                    if i_element.text == text:
                       return False
                return True
            except Exception as e:
                print "Failed to get element: %s" % e
        return False

    def __check_normal_text_element(self, text, key, display=True):
        element = self.__get_element_by_key(key, display)
        if element:
            try:
                for i_element in element.find_elements_by_xpath(str(
                        '//*[@value="{text}"]|'
                        '//*[contains(normalize-space(.),"{text}") '
                        'and not(./*[contains(normalize-space(.),"{text}")])]'
                        .format(text=text))):
                    if display:
                        try:
                            if i_element.is_displayed():
                                return i_element
                        except StaleElementReferenceException:
                            pass
                    else:
                        return i_element
            except Exception as e:
                print "Failed to get element: %s" % e
        return None

    def compare_two_values(self, first=None, second=None):
        try:
            if eval(self.text_value[first]) < eval(self.text_value[second]):
                return True
            else:
                return False
        except Exception as e:
            print "Failed to compare these two param: %s" % e
        return False

    def save_content(self, p_name=None, key=None):
        try:
            js_script = 'var style=document.getElementById(\"' + key + '\").innerHTML; return style'
            style = self.driver.execute_script(js_script)
            self.text_value[p_name] = style
            return True
        except Exception as e:
            print "Failed to get element: %s" % e
            return False

    def launch_app(self):
        try:
            desired_capabilities = self.app_config["desired-capabilities"]
            self.driver = WebDriver(
                str(self.app_config["driver-url"]), desired_capabilities)
        except Exception as e:
            print "Failed to launch %s: %s" % (self.app_name, e)
            return False
        return True

    def switch_url(self, url, with_prefix=True):
        if with_prefix:
            url = urljoin(self.url_prefix, url)
        try:
            self.driver.get(url)
        except Exception as e:
            print "Failed to visit %s: %s" % (url, e)
            return False
        return True

    def title(self):
        try:
            return self.driver.title
        except Exception as e:
            print "Failed to get title: %s" % e
            return None

    def current_url(self):
        try:
            return self.driver.current_url
        except Exception as e:
            print "Failed to get current url: %s" % e
            return None

    def reload(self):
        self.driver.refresh()
        return True

    def back(self):
        self.driver.back()
        return True

    def forward(self):
        self.driver.forward()
        return True

    def check_normal_text_timeout(self, text=None, display=True, timeout=2):
        end_time = time.time() + timeout
        while time.time() < end_time:
            if self.__check_normal_text(text, display):
                return True
            time.sleep(0.2)
        return False

    def check_normal_text_element_timeout(
            self, text=None, key=None, display=True, timeout=2):
        end_time = time.time() + timeout
        while time.time() < end_time:
            if self.__check_normal_text_element(text, key, display):
                return True
            time.sleep(0.2)
        return False

    def check_normal_text_element_timeout_with_color(
            self, text=None, key=None, color=None, display=True, timeout=2):
        end_time = time.time() + timeout
        while time.time() < end_time:
            if self.__check_normal_text_element(text, key, display):
                if self.check_text_color(key, color):
                    return True
            time.sleep(0.2)
        return False

    def check_normal_element_timeout_with_color(
            self, key=None, color=None, display=True, timeout=2):
        end_time = time.time() + timeout
        while time.time() < end_time:
            if self.check_background_color(key, color):
                return True
            time.sleep(0.2)
        return False

    def check_background_color(self, key=None, color=None, display=True):
        try:
            js_script = 'var bg_color=document.getElementById(\"' + key + '\").style.backgroundColor; return bg_color'
            bg_color = self.driver.execute_script(js_script)
            if not bg_color:
                js_script = 'var element=document.getElementById(\"' + key + '\");' \
                        ' if(element.currentStyle) {return element.currentStyle.backgroundColor;} ' \
                        ' else { return  document.defaultView.getComputedStyle(element,null).backgroundColor; } '
                bg_color = self.driver.execute_script(js_script)
            if not bg_color:
                bg_color = "white"
            number = re.match(r'[A-Za-z]+$',bg_color)
            if not number:
                bg_color = self.color_dict[bg_color]
            if bg_color.strip() == color:
              return True
        except Exception as e:
            print "Failed to get element color: %s" % e
        return False

    def check_text_color(self, key=None, color=None, display=True):
        try:
            js_script = 'var text_color=document.getElementById(\"' + key + '\").style.color; return text_color'
            text_color = self.driver.execute_script(js_script)
            if not text_color:
                js_script = 'var element=document.getElementById(\"' + key + '\");' \
                        ' if(element.currentStyle) {return element.currentStyle.color;} ' \
                        ' else { return  document.defaultView.getComputedStyle(element,null).color; } '
                text_color = self.driver.execute_script(js_script)
            if not text_color:
                text_color = "black"
            is_rgb = re.match(r'[A-Za-z]+$',text_color)
            if not is_rgb:
                text_color = self.color_dict[text_color]
            if text_color.strip() == color:
              return True
        except Exception as e:
            print "Failed to get element: %s" % e
        return False

    def check_content_type(self, key=None, display=True):
        try:
            js_script = 'var text=document.getElementById(\"' + key + '\").innerText; return text'
            text = self.driver.execute_script(js_script)
            if text.strip() == '':
               return 'none'
            number = re.match(r'(-?\d+)(\.\d+)?',text)
            if number:
               if "." in text:
                   return "float"
               else:
                   return "int"
            else:
               if text.upper() == "TRUE" or text.upper() == "FALSE":
                   return "boolean"
               else:
                   return "string"
        except Exception as e:
            print "Failed to get element text: %s" % e

    def press_element_by_key(self, key, display=True):
        element = self.__get_element_by_key(key, display)
        print "%s == %s" % (element.get_attribute("id"), element.get_attribute("class"))
        if element:
            element.click()
            return True

        return False

    def press_element_by_keys(self, key_p, key_c, display=True):
        element = self.__get_element_by_keys(key_p, key_c, display)
        print "%s == %s" % (element.get_attribute("id"), element.get_attribute("class"))
        if element:
            element.click()
            return True

        return False

    def press_element_by_key_attr(self, key, attr, display=True):
        element = self.__get_element_by_key_attr(key, attr, display)
        print "%s == %s" % (element.get_attribute("id"), element.get_attribute("class"))
        if element:
            element.click()
            return True

        return False

    def click_element_by_keys(self, key_p, key_c, display=True):
        element = self.__get_element_by_keys(key_p, key_c, display)
        print "%s == %s" % (element.get_attribute("id"), element.get_attribute("class"))
        if element:
            ActionChains(self.driver).click(element).perform()
            return True
        return False

    def click_element_by_key(self, key, display=True):
        element = self.__get_element_by_key(key, display)
        print "%s == %s" % (element.get_attribute("id"), element.get_attribute("class"))
        if element:
            ActionChains(self.driver).click(element).perform()
            return True
        return False

# * The method click_element_by_key will fail when VKB shelter the button, and js can avoid this issue.
    def click_element_by_id_with_js(self, key, display=True):
        element = self.__get_element_by_key_attr(key, "id", display)
        print "%s == %s" % (element.get_attribute("id"), element.get_attribute("class"))
        if element:
            js_script = 'document.getElementById(\"' + key + '\").click()'
            self.driver.execute_script(js_script)
            return True
        return False

    def click_element_coords(self, x, y, key, display=True):
        element = self.__get_element_by_key(key, display)
        if element:
            ActionChains(self.driver).move_to_element_with_offset(
                element, x, y).click().perform()
            return True
        return False

    def fill_element_by_key(self, key, text, display=True):
        element = self.__get_element_by_key(key, display)
        if element:
            element.send_keys(text)
            return True
        return False

    def fill_element_by_key_attr(self, key, attr, text, display=True):
        element = self.__get_element_by_key_attr(key, attr, display)
        if element:
            element.send_keys(text)
            return True
        return False

    def check_checkbox_by_key(self, key, display=True):
        element = self.__get_element_by_xpath(str(
            "//input[@id='%(key)s'][@type='checkbox']|"
            "//input[@name='%(key)s'][@type='checkbox']") % {'key': key}, display)
        if element:
            if not element.is_selected():
                element.click()
            return True
        return False

    def uncheck_checkbox_by_key(self, key, display=True):
        element = self.__get_element_by_xpath(str(
            "//input[@id='%(key)s'][@type='checkbox']|"
            "//input[@name='%(key)s'][@type='checkbox']") % {'key': key}, display)
        if element:
            if element.is_selected():
                element.click()
            return True
        return False

    def get_alert_text(self):
        try:
            alert_element = self.driver.switch_to_alert()
            if alert_element:
                return alert_element.text
        except Exception as e:
            print "Failed to get alert text: %s" % e

        return None

    def check_alert_existing(self):
        try:
            self.driver.switch_to_alert().text
        except NoAlertPresentException:
            return False
        return True

    def accept_alert(self):
        try:
            alert_element = self.driver.switch_to_alert()
            alert_element.accept()
            return True
        except Exception as e:
            print "Failed to accept alert: %s" % e
            return False

    def quit(self):
        if self.driver:
            self.driver.quit()