• Selenium学习笔记一


    安装、配置及元素定位

    1、安装

    Selenium的安装比较简单,采用如下指令即可完成安装:

    pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
    
    • 1

    2、下载浏览器驱动

    Selenium支持多款浏览器,如谷歌Chrome浏览器、微软Edge、IE浏览器以及火狐浏览器等,其中Chrome浏览器的驱动可以在此处下载,微软Edge浏览器的驱动可以在此处下载。本文以Edge浏览器为例进行测试。将下载好的驱动解压至Selenium脚本所在目录即可。

    3、访问网页

    采用如下代码引入Selenium库并打开百度网页:

    from selenium import webdriver
    driver = webdriver.Edge()
    driver.get("https://www.baidu.com")
    
    • 1
    • 2
    • 3

    4、定位元素

    对于元素的定位通常可以利用id、name、class_name三种属性进行定位,要注意的是这些属性值必须在当前界面是唯一的,否则会定位出多个元素,首先按F12进入开发者模式,接着获取输入框属性信息,最后采用如下代码实现在输入框中输入“selenium”字符串:

    ###方法一:采用name进行定位
    from selenium.webdriver.common.by import By
    driver.find_element(By.ID,"kw").send_keys("selenium")
    ###方法二:采用name进行定位
    driver.find_element(By.NAME,"wd").send_keys("selenium")
    ###方法三:采用name进行定位
    driver.find_element(By.CLASS_NAME,"s_ipt").send_keys("selenium")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    上述代码都可以实现在输入框中输入“selenium”进行搜索。然而,不是所有的元素都具有以上三个属性,以“新闻”为例,从下图中可以看出“新闻”元素没有id和name,利用Ctrl+F对class进行查找,发现存在多个相同的元素,因此想精确定位得更换方法,可以看出,页面中只存在一个“新闻”字符串,所以可以利用该信息进行定位,该信息被称为link text,定位代码如下:
    在这里插入图片描述

    driver.find_element(By.LINK_TEXT,"新闻").click()
    
    • 1

    上述代码可以实现点击网页中的“新闻”元素。与此同时也可以利用部分link text进行定位,代码如下所示:

    driver.find_element(By.PARTIAL_LINK_TEXT,"闻").click()
    
    • 1

    如果上述五种定位方法均无法准确定位元素,还可以采用XPATH进行定位,仍然以新闻为例:

    ###法一,采用唯一属性进行定位:
    driver.find_element(By.XPATH,"//a[@href='http://news.baidu.com']").click()
    ###法二,采用多属性and或者or的组合方式进行定位:
    driver.find_element(By.XPATH,"//a[@href='http://news.baidu.com' and @target='_blank']").click()
    ###法三,采用部分属性进行定位
    driver.find_element(By.XPATH,"//a[contains(@href,'news')]").click()
    driver.find_element(By.XPATH,"//a[starts-with(@href,'http://news')]").click()
    driver.find_element(By.XPATH,"//a[starts-with(@href,'http://') and contains(@href,'news')]").click()
    driver.find_element(By.XPATH,"//a[substring(@href,1)='http://news.baidu.com']").click()
    driver.find_element(By.XPATH,"//a[substring(@href,1,11)='http://news']").click()
    driver.find_element(By.XPATH,"//a[text()='新闻']").click()
    ####若不清楚'新闻'元素的位置,可以用以下代码进行定位
    driver.find_element(By.XPATH,"//*[contains(text(),'新闻')]").click()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    但是也会存在同一页面中存在多个相同属性的元素,如下图所示,虽然href有差异,但是href的值可能会发生变化,此时使用上述方法无法实现定位,可以采取层级定位的方法。
    在这里插入图片描述
    对于层级定位来说,可以首先定位到唯一的父节点,接着利用索引定位至子节点,具体代码如下:

    driver.find_element(By.XPATH,"//div[@id='s-top-left']/a[1]").click()
    
    • 1

    此外,可以利用driver.find_elements函数实现对一组元素的定位,具体使用方法与driver.find_element类似,示例如下:

    elements = driver.find_elements(By.XPATH,"//a[@class='mnav c-font-normal c-color-t']")
    if len(elements) > 1:
        elements[0].click()
    
    • 1
    • 2
    • 3

    5、网页提示窗口处理

    网页提示窗口的类型为alert,可以采用如下代码切换至弹窗,并打印提示信息,接着点击确定或取消按钮:

    alert = driver.switch_to.alert()
    print(alert.text)
    alert.accept() #点击确定按钮
    alert.dismiss() #点击取消按钮
    
    • 1
    • 2
    • 3
    • 4

    6、元素无法定位

    可能的原因主要有以下几点:
    (1)定位方式或者定位语句是否正确,是否因为存在多个相同元素导致定位失败;
    (2)页面由frame设计构成,需要先切换至元素所在的frame中,才能进行定位,切换方法如下:

    driver.switch_to.frame('frame_name')
    driver.switch_to.frame(1)
    driver.switch_to.frame(driver.find_elements(By.TAG_NAME, "iframe")[0])
    
    • 1
    • 2
    • 3

    如果要在不同的框架之间进行切换,需要跳出原来的框架,再切换至新的框架,若存在多级框架,可以一步一步跳回至上一级框架,再切换至新的框架:

    ###切换至主页面
    driver.switch_to.default_content()
    driver.switch_to.frame('frame_name2')
    ###切换至上一级框架
    driver.switch_to.parent_frame()
    driver.switch_to.frame('frame_name3')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    (3)对于下拉框中的选项进行定位,需要在定位元素之后转换为下拉框对象,首先需要引入下拉框依赖包,接着将元素转换为Select对象,最后通过index、value或者visible text进行定位。

    from selenium.webdriver.support.select import Select
    select = Select(driver.find_element(By.NAME,""))
    ###下拉框元素定位方法
    select.select_by_index()
    select.select_by_value()
    select.select_by_visible_text()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    别低头,皇冠会掉;别流泪,贱人会笑。
    1626 无矛盾的最佳球队(排序+动态规划)(灵神笔记)
    安装Ubuntu提示:系统找不到指定的文件。
    nginx 客户端返回499的错误码
    【SpringBoot】数据校验API
    PS制作文字扫光gif
    安装包 amd,amd64, arm,arm64 都有什么区别
    Hadoop(一)
    docker本地容器化部署项目
    【python】面向对象程序设计(基础篇)
  • 原文地址:https://blog.csdn.net/Lxh19920114/article/details/126300438