zoukankan      html  css  js  c++  java
  • Selenium(二):选择元素的基本方法

    阅读目录

    1.选择元素的基本方法

    1.选择元素的方法

    对于百度搜索页面,如果我们想自动化输入搜索内容,应该怎么做呢?

    这就是在网页中,操控界面元素

    web界面自动化,要操控元素,首先需要选择界面元素 ,或者说定位界面元素

    就是先告诉浏览器,你要操作哪个界面元素, 让它找到你要操作的界面元素。

    我们必须要让浏览器先找到元素,然后才能操作元素。

    1.1查看元素的方法                                                                    

    对应web自动化来说,就是要告诉浏览器,你要操作的界面元素是什么。

    那么,怎么告诉浏览器呢?

    方法就是:告诉浏览器,你要操作的这个web元素的特征。

    就是告诉浏览器,这个元素它有什么与众不同的地方,可以让浏览器一下子找到它。

    元素的特征怎么查看?

    可以使用浏览器的开发者工具栏帮我们查看、选择 web 元素。

    请大家用chrome浏览器访问百度,按F12后,点击下图箭头处的Elements标签,即可查看页面对应的HTML 元素

    然后,再点击最左边的图标,如下所示

    之后,鼠标在界面上点击哪个元素,就可以查看该元素对应的html标签了。

    也可以直接在你想要查看的位置,右键选择检查,就可以直接定位到元素了。

    1.2 根据元素的id属性选择元素

    我们在input中,可以看到有一个属性叫id。

    我们可以把id想象成元素的编号,是用来在html中标记该元素的。根据规范,如果元素有id属性,这个id必须是当前html中唯一的。

    所以如果元素有id,根据id选择元素是最简单高效的方式。

    这里,百度搜索框元素的id值为kw

    下面的代码,可以自动化在浏览器中访问百度,并且在输入框中搜索selenium。

    大家可以运行一下看看。

     1     from selenium import webdriver
     2     from time improt sleep
     3 
     4     #驱动Chrome
     5     driver = webdriver.Chrome()
     6     #打开百度页面,未登录状态
     7     driver.get("https://www.baidu.com/")
     8 
     9      
    10     # 根据id选择元素,返回的就是该元素对应的WebElement对象
    11     element = driver.find_element_by_id('kw')
    12      
    13     # 通过该 WebElement对象,就可以对页面元素进行操作了
    14     # 比如输入字符串到 这个 输入框里
    15     element.send_keys('selenium
    ')

    其中

    1. #驱动Chrome
      driver = webdriver.Chrome()

    前面讲过,driver赋值的是WebDriver类型的对象,我们可以通过这个对象来操控浏览器,比如打开网址、选择界面元素等。

    下面的代码 

    1. driver.find_element_by_id('kw')

    使用了 WebDriver对象的find_element_by_id方法。

    这行代码运行时,就会发起一个请求,通过浏览器驱动转发给浏览器,告诉它,需要选择一个id为kw的元素。

    浏览器找到id为kw的元素后,将结果通过浏览器驱动返回给自动化程序,所以find_element_by_id方法会返回一个WebElement 类型的对象。

    这个WebElement对象可以看成是对应页面元素的遥控器。

    比如 :

    调用这个对象的send_keys()方法就可以在对应的元素中输入字符串,

    调用这个对象的click()方法就可以点击该元素。

    我们通过这个WebElement对象,就可以操控对应的界面元素。

     

    1.3 根据元素的name属性选择元素

    我们在input中,可以看到有一个属性叫name。

    这里,百度搜索框元素的name值为wd

    下面的代码,可以自动化在浏览器中访问百度,并且在输入框中搜索selenium。

    大家可以运行一下看看。

     1     from selenium import webdriver
     2     from time improt sleep
     3 
     4     #驱动Chrome
     5     driver = webdriver.Chrome()
     6     #打开百度页面,未登录状态
     7     driver.get("https://www.baidu.com/")
     8 
     9      
    10     # 根据id选择元素,返回的就是该元素对应的WebElement对象
    11     element = driver.find_element_by_id('wd')
    12      
    13     # 通过该 WebElement对象,就可以对页面元素进行操作了
    14     # 比如输入字符串到 这个 输入框里
    15     element.send_keys('selenium
    ')

    其中

    1. #驱动Chrome
      driver = webdriver.Chrome()

    前面讲过,driver赋值的是WebDriver类型的对象,我们可以通过这个对象来操控浏览器,比如打开网址、选择界面元素等。

    下面的代码 

    1. driver.find_element_by_name('wd')

    使用了 WebDriver对象的find_element_by_name方法。

    这行代码运行时,就会发起一个请求,通过浏览器驱动转发给浏览器,告诉它,需要选择一个id为kw的元素。

    浏览器找到id为kw的元素后,将结果通过浏览器驱动返回给自动化程序,所以find_element_by_name方法会返回一个WebElement 类型的对象。

    这个WebElement对象可以看成是对应页面元素的遥控器。

    我们通过这个WebElement对象,就可以操控对应的界面元素。

    比如 :

    调用这个对象的send_keys()方法就可以在对应的元素中输入字符串,

    调用这个对象的click()方法就可以点击该元素。

    我们通过这个WebElement对象,就可以操控对应的界面元素。

    1.4 根据class属性选择元素

    web自动化的难点和重点之一,就是如何选择我们想要操作的web页面元素。

    除了根据元素的id和name,我们还可以根据元素的class属性选择元素

     1 #单元素定位
     2 from selenium import webdriver
     3 from time import sleep
     4 
     5 
     6 #main函数,程序运行入口
     7 if __name__ == "__main__":
     8     #驱动Chrome
     9     driver = webdriver.Chrome()
    10     #打开百度页面,未登录状态
    11     driver.get("https://www.baidu.com/")
    12     sleep(2)
    13     #页面单元素定位操作
    20     #class 属性定位
    21     element = driver.find_element_by_class_name("s_ipt")
    22     #操作元素->输入
    23     element.send_keys("selenium")
    24     sleep(2)
    25     #元素点击
    26     # button = driver.find_element_by_id("su")
    27     #复合型class选择其一
    28     button = driver.find_element_by_class_name("s_btn")
    29     button.click()
    30     sleep(2)
    31     driver.quit()

    #复合型class选择其一(若是class元素内是复合型元素,可以选择任意其中一个)
     driver.find_element_by_class_name("s_btn");

    若是向查看所选的元素是否有重合一样的,可以按Ctrl+F搜索查看是否有相同元素

    1.5 根据tag名选择元素

    和class方法差不多的,我们可以通过方法find_elements_by_tag_name,选择所有的tag名为div的元素

        from selenium import webdriver
        driver = webdriver.Chrome()        #驱动Chrome
    
        driver.get("https://www.baidu.com/") 
        # 根据 tag name 选择元素,返回的是 一个列表
        # 里面 都是 tag 名为 div 的元素对应的 WebElement对象
        elements = wd.find_elements_by_tag_name('div')
        # 取出列表中的每个 WebElement对象,打印出其text属性的值
        # text属性就是该 WebElement对象对应的元素在网页中的文本内容
        for element in elements:
            print(element.text)

    1.6 根据链接文本‘link’选择元素

    (1)driver.find_element_by_text()

    此种方法是专门用来定位文本链接的,比如百度首页右上角有“新闻”,“hao123”,“地图”等链接

    链接元素定位
    
    from selenium import webdriver
    from time import sleep
    
    if __name__ == "__main__":     #main函数,程序运行入口
    
        driver = webdriver.Chrome()        #驱动Chrome
    
        driver.get("https://www.baidu.com/")       #打开百度页面,未登录状态
        sleep(2)
        news = driver.find_element_by_link_text("新闻")         #链接元素文本信息定位
        news.click()     #点击
     
        sleep(2)       #等待2秒
       
        driver.quit()      #退出

    (2)部分链接定位(链接元素文本信息模糊定位)-partial_link定位:

             driver.find_element_by_partial_link_text()

    有时候一个超链接的文本很长很长,我们如果全部输入,既麻烦,又显得代码很不美观,这时候我们就可以只截取一部分字符串,用这种方法模糊匹配了。

     1 from selenium import webdriver
     2 from time import sleep
     3 
     4 #main函数,程序运行入口
     5 if __name__ == "__main__":
     6 
     7     driver = webdriver.Chrome()      #驱动Chrome
     8    
     9     driver.get("https://www.baidu.com/")    #打开百度页面,未登录状态
    10     sleep(2)  #等待2秒
    11 
    12     hao = driver.find_element_by_partial_link_text("hao")     #链接元素文本信息模糊定位
    13     hao.click()   #点击
    14     sleep(2)
    15     driver.quit()

    1.7 xpath路劲表达式--xpath定位:driver.find_element_by_xpath()

    前面介绍的几种定位方法都是在理想状态下,有一定使用范围的,那就是:在当前页面中,每个元素都有一个唯一的id或name或class或超链接文本的属性,那么我们就可以通过这个唯一的属性值来定位他们。

    但是在实际工作中并非有这么美好,有时候我们要定位的元素并没有id,name,class属性,或者多个元素的这些属性值都相同,又或者刷新页面,这些属性值都会变化。那么这个时候我们就只能通过xpath或者CSS来定位了。

    复制代码
    from selenium import webdriver
    from time import sleep
    
    
    # 启动浏览器
    driver = webdriver.Chrome()
    # 打开百度首页
    driver.get(r'https://www.baidu.com/')
    # 通过xpath定位搜索框,并输入selenium
    driver.find_element_by_xpath("//*[@id='kw']").send_keys('selenium')
    # 等待2秒
    sleep(2)
    # 退出
    driver.quit()
    复制代码

    1.8 css选择器-css定位:driver.find_element_by_css_selector()

    这种方法相对xpath要简洁些,定位速度也要快些,但是学习起来会比较难理解,这里只做下简单的介绍。

    复制代码
    from selenium import webdriver
    from time import sleep
    
    
    # 启动浏览器
    driver = webdriver.Chrome()
    # 打开百度首页
    driver.get(r'https://www.baidu.com/')
    # 通过css定位搜索框,并输入selenium
    driver.find_element_by_css_selector('#kw').send_keys('selenium')
    # 等待2秒
    sleep(2)
    # 退出
    driver.quit()
    复制代码

    1.9 find_elemen和find_elements的区别

    元素定位的方法有2个(单元素和多元素)

    #id 属性定位
    driver.find_element_by_id("kw")  返回值是WebElement            //此方法是获取单一的页面元素

    driver.find_elements_(By.args) 返回值是list<WebElement>  //此方法是获取多个页面元素;例如:获取一组复选框,然后都打上√号

    在选择器的选用时,要记得获取一个还是多个,要区分开 find_elements 还是 find_element 。这个s容易忽略。

    使用find_elements选择的是符合条件的所有元素,如果没有符合条件的元素,返回空列表。

    使用find_element选择的是符合条件的第一个 元素, 如果没有符合条件的元素, 抛出 NoSuchElementException异常。

  • 相关阅读:
    字符、字符串和文本处理
    接口
    泛型
    事件
    Expression表达式树 案例
    栈帧
    属性
    方法
    常量和字段
    Dynamic
  • 原文地址:https://www.cnblogs.com/nini0806/p/13660820.html
Copyright © 2011-2022 走看看