selenium有以下定位方式:

1

2

3

4

5

6

7

8

driver.find_element_by_id(‘id')

driver.find_element_by_xpath('xpath')

driver.find_element_by_link_text('link_text')

driver.find_element_by_partial_link_text('partial_link_text')

driver.find_element_by_name('name')

driver.find_element_by_tag_name('tag_name')

driver.find_element_by_class_name('class_name')

driver.find_element_by_css_selector('css_selector')

但我们看下源码:

D:\Program Files\Python27\Lib\site-packages\selenium\webdriver\remote\webdriver.py

可以看到,上面那些定位方式,实际上都是调用的driver.find_element(by, value)

我们继续看下find_element()的源码,大部分方法最终全是通过By.CSS_SELECTOR来实现的查找

那By又都有哪些条件呢?

D:\Program Files\Python27\Lib\site-packages\selenium\webdriver\common\by.py

继续看源码,可以看到下面8种

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"

所以我们以后就都只用find_element()就好了,因为最终实际上也都是调用的这个方法。

简单封装一下,以后就记住find_element()一个方法即可。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

from selenium.common.exceptions import TimeoutException

from selenium.webdriver.support.ui import WebDriverWait

from appium import webdriver

class BasePage(object):

    def split_locator(self, locator):

        """

        分解定位表达式,如'css,.username',拆分后返回'css selector'和定位表达式'.username'(class为username的元素)

        :param locator: 定位方法+定位表达式组合字符串,如'css,.username'

        :return: locator_dict[by], value:返回定位方式和定位表达式

        """

        by = locator.split(',')[0]

        value = locator.split(',')[1]

        locator_dict = {

            'id': 'id',

            'name': 'name',

            'class': 'class name',

            'tag': 'tag name',

            'link': 'link text',

            'plink': 'partial link text',

            'xpath': 'xpath',

            'css': 'css selector',

        }

        if by not in locator_dict.keys():

            raise NameError("wrong locator!'id','name','class','tag','link','plink','xpath','css',exp:'id,username'")

        return locator_dict[by], value

    def wait_element(self, locator, sec=30):

        """

        等待元素出现

        :param locator: 定位方法+定位表达式组合字符串,用逗号分隔,如'css,.username'

        :param sec:等待秒数

        """

        by, value = self.split_locator(locator)

        try:

            WebDriverWait(self.driver, sec, 1).until(lambda x: x.find_element(by=by, value=value),message='element not found!!!')

            log.info(u'等待元素:%s' % locator)

        return True

        except TimeoutException:

            return False

        except Exception, e:

            raise e

     

    def get_element(self, locator, sec=60):

        """

        获取一个元素

        :param locator: 定位方法+定位表达式组合字符串,用逗号分隔,如'css,.username'

        :param sec:等待秒数

        :return: 元素可找到返回element对象,否则返回False

        """

        if self.wait_element(locator, sec):

            by, value = self.split_locator(locator)

            try:

                element = self.driver.find_element(by=by, value=value)

                log.info(u'获取元素:%s' % locator)

                return element

            except Exception, e:

                raise e

        else:

            return False

    def get_elements(self, locator):

        """

        获取一组元素

        :param locator: 定位方法+定位表达式组合字符串,用逗号分隔,如'css,.username'

        :return: elements

        """

        by, value = self.split_locator(locator)

        try:

            elements = WebDriverWait(self.driver, 60, 1).until(lambda x: x.find_elements(by=by, value=value))

            log.info(u'获取元素列表:%s' % locator)

            return elements

        except Exception, e:

            raise e

以后调用,先定义元素,如

button = "id,su" # 页面上id为su的元素

在用例中查找时,只要写

find_element(button)

​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐