zoukankan      html  css  js  c++  java
  • (二)selenium 浏览器常用操作_八种元素定位

    一、浏览器基本操作

    1.1 、 启动

    方法 作用
    Chrome() 启动浏览器,不同浏览器方法名不一样
    get() 打开某个网页,网页地址以参数传入方法
    quit() 关闭浏览器

    不同浏览器启动方法

    # # Firefox 火狐浏览器
    # driver = webdriver.Firefox()
    #
    # # 谷歌浏览器
    # driver = webdriver.Chrome()
    #
    # # ie 浏览器
    # driver = webdriver.Ie()
    #
    # # Edge 浏览器
    # driver = webdriver.Edge()
    #
    # # Opera 浏览器
    # driver = webdriver.Opera()
    #
    # # PhantomJS浏览器
    # driver = webdriver.PhantomJS()
    

    from selenium import webdriver
    
    # 指定驱动位置
    path = "D:\chromedriver.exe"
    # 启动浏览器
    driver = webdriver.Chrome(executable_path=path)
    # 打开一个网页 如:百度
    driver.get("http://www.baidu.com/")
    
    # 关闭浏览器
    driver.quit()
    
    

    1.2、 浏览器窗口的操作

    方法 作用
    maximize_window() 窗口最大化
    minimize_window() 窗口最小化
    fullscreen_window() 全屏化窗口
    set_window_size(width,height) 设置浏览器大小
    set_window_position(x,y) 指定浏览器位置

    # 窗口最大化
    driver.maximize_window()
    # 等待3秒
    sleep(3)
    # 窗口最小化  等于看不见
    driver.minimize_window()
    sleep(3)
    
    # 窗口全屏化
    driver.fullscreen_window()
    sleep(3)
    
    # 设置窗口大小  宽度,高度
    driver.set_window_size(300,200)
    sleep(3)
    
    # 指定窗口位置 宽度,高度 以左上角 为坐标
    driver.set_window_position(100,150)
    sleep(3)
    
    

    1.3 、网页基本操作

    方法 作用
    forward() 前进
    back() 后退
    refresh() 刷新
    closs() 关闭

    from selenium import webdriver
    from time import sleep
    
    options = webdriver.ChromeOptions()
    
    # 指定驱动
    driver_path = "D:\drivers\chromedriver.exe"
    driver = webdriver.Chrome(driver_path,options=options)
    
    # 先打开百度网页
    driver.get("http://www.baidu.com")
    
    # 等待五秒
    sleep(3)
    
    # 在打开东方财富网
    driver.get("https://www.eastmoney.com/")
    
    # 然后 后退 到百度
    driver.back()
    
    # 等待3秒
    sleep(3)
    
    # 在刷新一下
    driver.refresh()
    
    # 给1秒的缓冲
    sleep(1)
    
    # 在前进到 东方财富网
    driver.forward()
    
    #关闭网页 
    driver.close()
    


    二、元素定位

    我们对网页的各种操作,其实都是对前端元素的操作,那你想实现自动化操作,首要就是查找你要操作的元素,只有匹配到元素才能实现后续的操作。

    selenium 元素定位有八种方式

    方法 作用
    find_element_by_id() 根据id属性定位
    find_element_by_name() 根据name属性定位元素
    find_element_by_link_text() 根据超链接的文字信息
    find_element_by_partial_link_text() 根据超链接的部分文字信息
    find_element_by_tag_name() 根据tag名称
    find_element_by_class_name() 根据class名称
    find_element_by_xpath() 根据xpath表达式
    find_element_by_css_selector() 根据css选择器

    注:
    find_element_by_xx
    如果没有匹配到元素,则执行报错
    如果匹配到一个元素,则返回元素
    如果匹配到多个元素,则返回元素

    find_elements_by_xx
    如果没有匹配到元素,则返回空列表
    如果匹配到一个元素,则返回包含一个元素的列表
    如果匹配到多个元素,则返回包含多个元素的列表


    2.1、 id定位

    id 属性在html文件里具有唯一性,是我们优先使用的一种方法

    from seleniumimport webdriver
    
    d= webdriver.Chrome()
    d.get('https://www.baidu.com')
    
    d.find_element_by_id("kw").send_keys("hello")
    

    2.2 、name 定位

    from seleniumimport webdriver
    
    d= webdriver.Chrome()
    d.get('https://www.baidu.com')
    
    d.find_element_by_name("wd").send_keys("hello")
    

    2.3、 calss 定位

    from seleniumimport webdriver
    
    d= webdriver.Chrome()
    d.get('https://www.baidu.com')
    
    d.find_element_by_class_name('s_ipt').send_keys('hello')
    
    # 复合class 如:class="bg s_ipt_wr quickdelete-wrap" ,有多个calss属性由空格隔开,我们只能取其中一个
    d.find_element_by_class_name('s_ipt_wr')
    

    2.4、 tag 定位

    我们就知道HTML是通过tag来定义功能的,比如input是输入,table是表格,等等...。每个元素其实就是一个tag,一个tag往往用来定义一类功能,我们查看百度首页的html代码,可以看到有很多重复的div,input,a等tag, 多个tag的时候 我们要用find_elements_by_tag_name() 他返回的是一个列表 ,我们要对这个列表选索引值进行操作 在我们工作中较少用这种定义方法,仅了解就行。

    from selenium import webdriver
    
    d = webdriver.Chrome("D:\chromedriver.exe")
    
    d.get("http://www.baidu.com")
    d.find_element_by_tag_name("area").click()
    
    

    link_text 是我们定位一个超链接最常用的,我们的元素值就是这个超链接的文本 ,精确匹配

    from seleniumimport webdriver
    import time         # 调了一个时间模块
    
    d= webdriver.Chrome()
    d.get('https://www.baidu.com')
    
    d.find_element_by_link_text('新闻').click()
    time.sleep(5) # 让等待5秒
    d.quit() 
    

    partial_link_text 也用来定位超链接 ,只不过他与link_text 精确匹配不同 他是 一个模糊匹配

    from selenium import webdriver
    from time import sleep
    
    options = webdriver.ChromeOptions()
    
    # 指定驱动
    driver_path = "D:\drivers\chromedriver.exe"
    driver = webdriver.Chrome(driver_path,options=options)
    
    # 先打开百度网页
    driver.get("http://www.baidu.com")
    driver.find_element_by_id("kw").send_keys("selenium")
    sleep(1)
    driver.find_element_by_id("su").click()
    sleep(3)
    # 模糊查找 selenium中文网 并点击一下
    driver.find_element_by_partial_link_text("selenium中文网").click()
    
    sleep(5)
    
    driver.quit()
    

    2.7、 xpath 定位,路径表达式定位

    前面介绍的几种定位方法都是在理想状态下,有一定使用范围的,那就是:在当前页面中,每个元素都有一个唯一的id或name或class或超链接文本的属性,那么我们就可以通过这个唯一的属性值来定位他们。但是在实际工作中并非有这么美好,有时候我们要定位的元素并没有id,name,class属性,或者多个元素的这些属性值都相同,又或者刷新页面,这些属性值都会变化。那么这个时候我们就只能通过xpath或者CSS来定位了。


    2.7.1 路径

    绝对路径:从根节点开始,到目标位置

    xpathstr ="/html/body/div[1]/div[1]/div/form/span[1]/input"
    d.find_element_by_xpath(xpathstr)

    特点:路径唯一,但是通常比较深,容易受页面改动影响

    相对路径:从任意位置,或当前位置开始

    xpathstr ="//input[@id='kw']"
    d.find_element_by_xpath(xpathstr)

    特点:书写形式灵活多样,推荐使用


    2.7.2 相对匹配方式

    下面是相对路径几种方式介绍

    根据标签类型定位
      xpathstr ="//input"   这样写是匹配input类型的所有元素

    根据顺序定位:
      xpathstr ="//inputp[2]"    有层级中的第二个input元素
      xpathstr ="//div[last()-1]    查找页面上各个层级中倒数第二个div元素

    根据元素属性定位:
      xpathstr ="//input[@value]"    input类型的标签,并且有value属性的元素
      xpathstr ="//input[@value = 'kw']"   input类型value值为kw 的元素

    使用运算符
      xpathstr ="//input[@value='kw' and @ id='ad']    input类型value属性值为kw 并且id属性为 ad的元素
      xpathstr ="//input[@maxlength <256]"      maxlength值小于256的input元素

    层级与属性结合定位
      xpathstr = "//form/input"    form元素下的input子元素
      xpathstr = "//div[@class]/a[3]"    div的第三个a标签元素,div具有class属性

    使用通配符
      xpathstr = "//tools/*"    选出所有的tools所有的子元素
      xpathstr = "//*[@*="s_tab"]"   任意类型,任意属性值为's_tab'的元素

    模糊匹配
      xpathstr = "//a[contains(@href,'logout')]"  使用contains函数进行部分匹配
      xpathstr = "//a[contains(text(),退出)]"  超链接文本内容包括"退出字符"

    xpath

    更多可以参考:https://www.w3school.com.cn/xpath/index.asp

    from seleniumimport webdriver
    import time
    d= webdriver.Chrome()
    d.get('https://www.baidu.com')
    # 定位搜索框,然后输入hello
    d.find_element_by_xpath('//*[@id="kw"]').send_keys('hello')
    time.sleep(5)
    d.quit()
    

    2.8、 css_selector 定位

    css定位相对比xpath要简洁些,定位速度也要快些,selenium也比较推荐这种方式,但是学习起来会比较难理解,因为他有太多的样式,这里介绍一下比较简单常用的几种方式

    选择器 例子 描述
    #id #firstname 选择 id="firstname" 的元素。
    .class .intro 选择 class="intro" 的所有元素。
    element>element div > p 选择父元素是 <div> 的所有 <p> 元素。
    [attribute=value] [target=_blank] 选择带有 target="_blank" 属性的所有元素。

    更多可参考:https://www.w3school.com.cn/cssref/css_selectors.asp

    from selenium import webdriver
    import time
    d = webdriver.Chrome()
    d.get('https://www.baidu.com')
    # 加断言,若在直接就下一步 不会有什么反应,如果不在 就会报错
    assert '百度' in d.title  
    # 先清除一下搜索框
    d.find_element_by_css_selector('#kw').clear()
    d.find_element_by_css_selector('#kw').send_keys('hello')
    time.sleep(5)
    d.quit()
    


    在介绍两种现在比较推荐的方法

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    
    d = webdriver.Chrome("D:\chromedriver.exe")
    
    d.get("http://www.baidu.com")
    
    d.find_element(By.ID,"kw").send_keys("selenium")
    d.find_elements(By.NAME,"wd")[0].send_keys("selenium")
    
  • 相关阅读:
    鬼斧神工---计算机的开机启动过程
    微服务之日志落盘设计
    微服务架构设计
    一条SQL语句执行得很慢的原因有哪些?
    996:只要能活着就好,不管活得多么糟糕
    事务隔离性与隔离级别
    数据库悲观锁与乐观锁
    解决百度网盘(百度云)分享链接不存在失效、分享的文件已经被取消的问题
    宁撞金钟一下,不打破鼓三千,IT人要有志气,要进就进大的好的公司
    1430:家庭作业
  • 原文地址:https://www.cnblogs.com/niunai/p/15057537.html
Copyright © 2011-2022 走看看