• selenium模块


    安装

    1.导入selenium模块
    2.安装与浏览器版本对应的自动化测试工具 谷歌浏览器从ChromeDriver网站中找

    基本使用

    from selenium.webdriver import Chrome
    from selenium.webdriver.chrome.options import Options # 导入自定义配置模块
    
    
    # 创建配置对象
    chrome_options = Options()
    # chrome_options.add_argument('window-size=1920x3000') #指定浏览器分辨率
    chrome_options.add_argument('--disable-gpu') #谷歌文档提到需要加上这个属性来规避bug
    chrome_options.add_argument('--hide-scrollbars') #隐藏滚动条, 应对一些特殊页面
    chrome_options.add_argument('blink-settings=imagesEnabled=false') #不加载图片, 可以提升速度
    # chrome_options.add_argument('--headless') #浏览器不提供可视化页面. linux下如果系统如果无界面不加这条会启动失败
    chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])#取消浏览器驱动提示
    
    #如果将浏览器驱动的路径设置到环境变量,可以不用传参数
    #options 表示配置项
    driver = Chrome(options=chrome_options)
    driver.get('https://sports.qq.com/nba/') #访问腾讯体育
    text = driver.page_source #获取页面的源代码 可以从中获取数据
    print(text)

    解析数据

    # selenium提供了很多用于解析数据的函数
    
    from selenium.webdriver import Chrome
    
    driver = Chrome()
    driver.get('http://www.baidu.com') #访问百度
    
    tag = driver.find_element_by_class_name('index-logo-src') #通过类名拿到标签
    # tag = driver.find_element_by_css_selector('.index-logo-src')
    
    #标签的相关内容
    print(tag.text)  #标签内容
    print(tag.parent) #得到的是driver对象,不是父标签
    print(tag.get_attribute('src'))#拿到标签中src属性
    print(tag.tag_name) #标签名
    
    #一些特别的查找方式
    
    #根据连接的文本查找
    tag1 = driver.find_element_by_link_text('学术') #文本完全匹配
    tag2 = driver.find_element_by_partial_link_text('') #文本部分匹配
    
    tag3 = driver.find_element_by_name('tj_trhao123') #属性名name=tj_trhao123
    tag4 = driver.find_element_by_tag_name('body') #标签名称为body
    
    #所有方法都带有s的版本,用来获取查找所有匹配,返回一个列表
    res = driver.find_elements_by_class_name("mnav")
    print(res)
    
    #嵌套查找
    tag5 = driver.find_element_by_class_name("tools")
    tag6 = tag5.find_element_by_css_selector("#mHolder")
    
    #与显示相关的属性
    tag7 = driver.find_element_by_class_name("index-logo-src")
    print(tag7.location) #位置信息
    print(tag7.size)  #大小信息
    
    #打开浏览器10s后自动关闭
    import time
    time.sleep(10)
    driver.close()
    
    #注意:通过class查找,driver.find_element_by_class_name() ()里面只能有一个值,不能存在空格隔开的多个值

    等待元素加载

    #完成百度搜索,先搜索redvelvet 1s 后搜索wendy
    
    from selenium.webdriver import Chrome
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    
    driver = Chrome()
    driver.get('https://www.baidu.com')
    
    #隐式等待
    driver.implicitly_wait(10)  #当要查找的某个元素不存在时 会等一会查找一次(轮询)直到找到该元素 如果超时,则会报错
    
    #找到输入框
    key_input = driver.find_element_by_id('kw')
    
    #发送搜索信息
    key_input.send_keys('redvelvet')
    
    #回车
    key_input.send_keys(Keys.ENTER)
    
    #显示等待 明确等待某一个元素 满足某个条件
    #等到页面上出现一个id为content_left 的元素为止,最长等待时间为10s
    WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'content_left')))
    
    #获取搜索结果 如果直接获取元素,可能因为页面没有加载完毕 导致获取失败,需要完成等待元素加载的操作
    div = driver.find_element_by_id('content_left')
    print(div)
    
    import time
    time.sleep(1)
    
    key_input = driver.find_element_by_id('kw')
    key_input.clear() #清空输入框
    key_input.send_keys('wendy')
    key_input.send_keys(Keys.ENTER)

    动作链

    from selenium.webdriver import Chrome
    #创建动作链对象要导入的模块
    from  selenium.webdriver import ActionChains
    
    driver = Chrome()
    driver.get("http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
    
    #隐式加载
    driver.implicitly_wait(5)
    
    #切换fream 页面分了好几个fream 我们要切换到标签所在的fream
    driver.switch_to.frame("iframeResult")
    
    #获取要拖动的标签
    tag = driver.find_element_by_id('draggable')
    #要拖动标签的位置
    print(tag.location)
    
    #获取目标位置标签
    tag2 = driver.find_element_by_id('droppable')
    #目标标签的位置
    print(tag2.location)
    
    #创建一个动作对象
    asc = ActionChains(driver)
    
    #x移动的距离
    # dis = tag2.location['x'] - tag.location['x']
    # asc.click_and_hold(tag).perform()   #点击并且按住,perform表示执行这一动作
    # asc.move_to_element(tag2).perform() #移动到指定标签位置
    # asc.release().perform() #松手
    #上述方式 线性移动 几乎瞬移 很容易被判断为机器人(程序)
    
    #解决方法
    asc.click_and_hold(tag).perform()
    #循环逐渐移动
    while tag.location['x'] < tag2.location['x']:
        ActionChains(driver).move_by_offset(1,0).perform()  #每次朝x移动1
    asc.release().perform()
    
    #==============================================================================
    #切换到当前fream的父辈fream
    driver.switch_to.parent_frame()
    #拿到父辈fream中的标签
    driver.find_element_by_id('textareaCode')

    补充

    from selenium.webdriver import Chrome
    
    
    driver = Chrome()
    driver.get("https://www.baidu.com")
    
    #1.执行js
    driver.execute_script("alert('小电影')")
    
    #2.导航前进后退
    driver.get("https://www.baidu.com")
    driver.get("https://www.qq.com")
    driver.get("https://www.sina.com")
    
    driver.back() #后退
    driver.forward() #前进
    
    #3.切换选项卡
    #创建选项卡
    driver.execute_script('window.open()')
    #切换到指定选项卡
    driver.switch_to.window(driver.window_handles[1])
    #在新的选项卡中加载下面页面
    driver.get('https://www.qq.com')
    #再次切换选型卡
    driver.switch_to.window(driver.window_handles[0])

    案例:爬取天猫汽车

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.common.keys import Keys
    import time
    
    # 创建配置对象
    chrome_options = Options()
    # chrome_options.add_argument('window-size=1920x3000') #指定浏览器分辨率
    chrome_options.add_argument('--disable-gpu') #谷歌文档提到需要加上这个属性来规避bug
    # chrome_options.add_argument('--hide-scrollbars') #隐藏滚动条, 应对一些特殊页面
    chrome_options.add_argument('blink-settings=imagesEnabled=false') #不加载图片, 可以提升速度
    
    driver = webdriver.Chrome(options=chrome_options)
    driver.get("https://pages.tmall.com/wow/car/act/zhizu")
    driver.implicitly_wait(10)
    
    # 天猫汽车是懒加载 需要滑动屏幕显示出对应数据再获取
    
    # 这种方式 无法预知到底要按多少次下
    # for i in range(1000):
    #     driver.find_element_by_tag_name("body").send_keys(Keys.DOWN)
    
    #平滑到底部 加载所有数据到页面 滑动速度太快,无法加载完善
    #scrollTo可以把内容滚动到指定的坐标 ({})里面包含top和behavior两个参数
    #document.body.clientHeight 获取页面高度
    # driver.execute_script("""
    # window.scrollTo({
    #     top: document.body.clientHeight,
    #     behavior:'smooth'
    #     })
    # """)
    
    # 慢慢滑动
    # 执行js获取总高度
    height = driver.execute_script("return document.body.clientHeight")
    # 已经滑动的距离
    dis = 0
    while dis < height:
        driver.execute_script("""
        window.scrollTo({
            top: %s,
            behavior: "smooth"
        });""" % dis)
        dis += 200
        #防止均匀加速
        time.sleep(0.2)
    
    # 获取页头 四个推荐数据
    big_div = driver.find_element_by_class_name("zebra-car-goods-1x1")
    item_div = big_div.find_element_by_css_selector("div")
    res = item_div.find_elements_by_css_selector(".item")
    for i in res:
        print(i.find_element_by_tag_name("a").get_attribute("href"))
        print(i.find_element_by_css_selector(".img").get_attribute("src"))
        print(i.find_element_by_css_selector(".info .title").text)
        infos = i.find_elements_by_css_selector(".interest")
        print([k.text for k in infos])
    
    # 获取汽车列表
    sections = driver.find_elements_by_class_name("zebra-car-goods-1x2")
    for s in sections:
        bloks = s.find_elements_by_css_selector(".block")
        for b in bloks:
            print(b.find_element_by_css_selector("a").get_attribute("href"))
            print(b.find_element_by_css_selector(".main").get_attribute("src"))
            print(b.find_element_by_css_selector(".title").text)
            infos = b.find_elements_by_css_selector(".interest")
            print([k.text for k in infos])
    driver.close()
  • 相关阅读:
    tcp传送报文
    整理下本周工作中遇到的疑问;uid/euid/suid;docker镜像管理
    网络隔离
    ubuntu 只有客人会话登录(第一次深刻感受文件权限的威力 )
    ubuntu 只有客人会话登录(第一次深刻感受文件权限的威力)
    使用gdb查看栈帧的情况,有ebp
    使用gdb查看栈帧的情况, 没有ebp
    再看perf是如何通过dwarf处理栈帧的
    dwarf是如何处理栈帧的?
    数据库设计的误区—>CHAR与VARCHAR
  • 原文地址:https://www.cnblogs.com/lizeqian1994/p/10751172.html
Copyright © 2020-2023  润新知