Appium-Python-Client 소스코드 분석 (1) 드라이버 요소 검색 방법

목차

머리말

소스 버전: 0.9

구조 다이어그램:

mobileby.py

appium-webdriver.py

셀레늄-webdriver.py

셀레늄 드라이버

appiumdriver


머리말

Appium-Python-Client는 Python 언어용 Appium 클라이언트 라이브러리로, 모바일 애플리케이션용 자동화 테스트를 작성하고 실행하기 위한 풍부한 API와 기능을 제공합니다. 이 글에서는 Appium-Python-Client의 소스 코드를 드라이버의 요소 검색 방식을 중심으로 심도있게 분석해 보겠습니다.

Appium의 실용적인 방법은 Client의 소스코드에 모두 숨겨져 있습니다.
알아채다! 드라이버 및 웹 요소 인스턴스의 경우 해당 요소 검색 방법(웹 요소는 다음 하위 요소 검색)이 있으며 이 문서에서 설명하는 요소 검색은 드라이버 인스턴스를 대상으로 합니다.

소스 버전: 0.9

구조 다이어그램:

mobileby.py

자, 이제 find_element_by_xxxx와 같은 일부 찾기 방법을 사용자 정의해야 한다면 어떻게 해야 할까요? Appium은 ACCESSIBILITY_ID 등과 같은 자체 메서드 집합이 있는 몇 가지 확장된 찾기 메서드를 제공합니다. 이러한 메서드를 사용자 지정하기 위해 appium이 가장 먼저 수행하는 작업은 By Class 상속에서 파생된 MobileBy 클래스를 사용자 지정하는 것입니다. 그런 다음 일부 필수 속성을 추가합니다. 이러한 속성의 값은 일부 텍스트입니다. 작동하지 않는 것에 대해 걱정하지 마십시오. webdriver의 원리에 익숙하다면 더 잘 이해해야 합니다.

#!/usr/bin/env python
from selenium.webdriver.common.by import By

class MobileBy(By): #这里显然是一个继承
    """三个扩展属性,清清楚楚地罗列在这里"""
    IOS_UIAUTOMATION = '-ios uiautomation'
    ANDROID_UIAUTOMATOR = '-android uiautomator'
    ACCESSIBILITY_ID = 'accessibility id'

By 클래스를 상속받았기 때문에 By 클래스에도 아래에서 사용할 classmethod가 있으므로 By 클래스를 직접 살펴보겠습니다.

class By(object):
    """
    Set of supported locator strategies.
    """

    ID = "id"
    XPATH = "xpath"
    LINK_TEXT = "link text"
    PARTIAL_LINK_TEXT = "partial link text"
    NAME = "name"
    TAG_NAME = "tag name"
    CLASS_NAME = "class name"
    CSS_SELECTOR = "css selector"

    @classmethod #好吧,我是一个类方法,下文中会用到我
    def is_valid(cls, by): #cls是把类对象本身传进来
        for attr in dir(cls):
            if by == getattr(cls, attr): #判断是不是可用的查找方式
                return True
        return False

이 MobileBy 클래스는 어디에서 작동합니까? 그것을 추적하고 여기로 갑시다:

appium-webdriver.py
def find_element_by_ios_uiautomation(self, uia_string):
    """Finds an element by uiautomation in iOS.

    :Args:
     - uia_string - The element name in the iOS UIAutomation library

    :Usage:
        driver.find_element_by_ios_uiautomation('.elements()[1].cells()[2]')
    """
    #这里直接访问Appium自己定义的几个类属性
    return self.find_element(by=By.IOS_UIAUTOMATION, value=uia_string)

def find_elements_by_ios_uiautomation(self, uia_string):
    """Finds elements by uiautomation in iOS.

    :Args:
     - uia_string - The element name in the iOS UIAutomation library

    :Usage:
        driver.find_elements_by_ios_uiautomation('.elements()[1].cells()[2]')
    """
    return self.find_elements(by=By.IOS_UIAUTOMATION, value=uia_string)

def find_element_by_android_uiautomator(self, uia_string):
    """Finds element by uiautomator in Android.

    :Args:
     - uia_string - The element name in the Android UIAutomator library

    :Usage:
        driver.find_element_by_android_uiautomator('.elements()[1].cells()[2]')
    """
    return self.find_element(by=By.ANDROID_UIAUTOMATOR, value=uia_string)

def find_elements_by_android_uiautomator(self, uia_string):
    """Finds elements by uiautomator in Android.

    :Args:
     - uia_string - The element name in the Android UIAutomator library

    :Usage:
        driver.find_elements_by_android_uiautomator('.elements()[1].cells()[2]')
    """
    return self.find_elements(by=By.ANDROID_UIAUTOMATOR, value=uia_string)

def find_element_by_accessibility_id(self, id):
    """Finds an element by accessibility id.

    :Args:
     - id - a string corresponding to a recursive element search using the
     Id/Name that the native Accessibility options utilize

    :Usage:
        driver.find_element_by_accessibility_id()
    """
    return self.find_element(by=By.ACCESSIBILITY_ID, value=id)

def find_elements_by_accessibility_id(self, id):
    """Finds elements by accessibility id.

    :Args:
     - id - a string corresponding to a recursive element search using the
     Id/Name that the native Accessibility options utilize

    :Usage:
        driver.find_elements_by_accessibility_id()
    """
    return self.find_elements(by=By.ACCESSIBILITY_ID, value=id)

이제 우리는 이러한 appium의 확장 메서드가 webdriver.Remote 클래스를 상속하여 직접 확장된다는 것을 알고 있습니다.

셀레늄-webdriver.py

자, 마침내 구현의 주요(핵심) 부분인 find_element, find_elements에 도달했습니다.

def find_element(self, by=By.ID, value=None):
        """
        'Private' method used by the find_element_by_* methods.

        :Usage:
            Use the corresponding find_element_by_* instead of this.

        :rtype: WebElement
        """
        if not By.is_valid(by) or not isinstance(value, str):
            raise InvalidSelectorException("Invalid locator values passed in")

        return self.execute(Command.FIND_ELEMENT,
                             {'using': by, 'value': value})['value']

    def find_elements(self, by=By.ID, value=None):
        """
        'Private' method used by the find_elements_by_* methods.

        :Usage:
            Use the corresponding find_elements_by_* instead of this.

        :rtype: list of WebElement
        """
        if not By.is_valid(by) or not isinstance(value, str):
            raise InvalidSelectorException("Invalid locator values passed in")

        return self.execute(Command.FIND_ELEMENTS,
                             {'using': by, 'value': value})['value']

좋습니다. 처음부터 끝까지 다시 시도해 보겠습니다.

Appium은 고유한 찾기 검색 방법을 구현하기 위해 먼저 MobileBy 클래스를 사용자 정의하고 이 클래스 객체에 정의된 일부 확장 속성을 넣었습니다. 이러한 속성의 값은 식별 및 실행을 위해 서버 측으로 푸시됩니다. appium은 webdriver.Remote를 잘 계승하고 확장한 후 드라이버 인스턴스의 find_element와 find_elements 두 가지 핵심 메소드를 호출하여 요소 검색을 구현합니다. appiumdriver 인스턴스는 모든 seleniumdriver를 사용할 수 있습니다. 요소 검색의 인스턴스 메서드와 관련하여 해당 목록을 정렬할 수 있습니다.

셀레늄 드라이버

find_element_by_id
find_elements_by_id find_elements_by_id
find_element_by_name
find_elements_by_name
find_element_by_link_text
find_elements_by_link_text find_element_by_partial_link_text find_elements_by_partial_link_text
find_element_by_tag_name find_elements_by_tag_name find_element_by_xpath find_elements_by_xpath find_element_by_class_name find_element s_by_class_name find_element_by_css_selector find_elements_by_css_selector








appiumdriver

find_element_by_ios_uiautomation
find_elements_by_ios_uiautomation
find_element_by_android_uiautomator
find_elements_by_android_uiautomator
find_element_by_accessibility_id
find_elements_by_accessibility_id

 

  다녀온 사람으로서 우회는 삼가하시길 바라겠습니다.

여기에서 자동화된 테스트를 진행하는 데 필요한 몇 가지 필수 사항을 공유하고 도움이 되기를 바랍니다.

(소프트웨어 테스트 관련 자료, 자동화 테스트 관련 자료, 기술적인 질문과 답변 등)

나는 그것이 당신을 더 나은 발전으로 이끌 수 있다고 믿습니다!

아래 작은 카드를 클릭하세요

 

Supongo que te gusta

Origin blog.csdn.net/Free355/article/details/131765248
Recomendado
Clasificación