zoukankan      html  css  js  c++  java
  • 选择、操作web元素-2

    11月3日

    等待web元素的出现

    例子:百度搜索松勤网,点击操作后不等待页面刷新,下面选择页面元素的时候,该元素还是未出现

    sleep方案的弊病:固定的等待时间,导致测试用例执行时间很长

    为什么click函数不像get函数等待页面刷新?click未必会导致页面更新,get一定会导致页面更新

    selenium解决方案:选择一个元素的时候,代码设定一个最大等待时长,周期性(每隔半秒钟)重新寻找元素,直到该元素找到(返回),或者超出指定最大等待时长(返回空列表或者抛出异常),find_element_by都会循环等待

    隐式等待:全局的设定,后面所有的选择的代码都不需要单独的指定周期性等待了  driver.implicitly_wait(10)

    也可以先设置10,若有特殊等待时间,在设置一个值(比如60),调用完毕后再改回来

    显示等待:为一个操作专门指定等待时间

    from selenium.webdriver.support.ui import WebDriverWait

    form selenium.webdriver.support import expected_conditions as EC

    form selenium.webdriver.common.by import By

    ele = WebDriverWait(driver,60).until(EC.presence_of_element_located((By.ID,'username')))

    frame的处理

    一个例子 :获取网易云音乐排行榜信息   http://music.163.com/#/discover/toplist?id=60198

    什么是frame 和iframe  http://www.w3school.com.cn/html/html_iframe.asp

    切换到frame里面

    driver.switch_to.frame(frame_reference)

      frame元素的name属性或者ID属性

      索引值(从0开始):0

      frame所对应的WebElement:driver.find_element_by_tag_name("iframe")

    切换回主html里面:driver.switch_to.default_content()

    注意那些会变的ID

    Selenium 作业 2

    打开百度新歌榜, http://music.baidu.com/top/new
    
    在排名前50的歌曲中,找出其中排名上升的歌曲和演唱者
     
    注意: 有的歌曲名里面有 "影视原声" 这样的标签, 要去掉
    
    
    最终结果显示的结果如下:
    我不能忘记你       :  林忆莲
    等                :  严艺丹
    飞天              :  云朵
    粉墨              :  霍尊
    春风十里不如你     :  李健
    








    参考答案,往下翻

    方法1

    # coding:utf8
    from selenium import webdriver
    
    driver = webdriver.Chrome(r"d:	oolswebdriverschromedriver.exe")
    # driver.implicitly_wait(1)
    # 抓取排行榜信息
    
    driver.get('http://music.baidu.com/top/new')
    
    # 层层往下查找
    div = driver.find_element_by_id("songListWrapper")
    ul = div.find_element_by_tag_name("ul")  #这行可以省略
    liList = ul.find_elements_by_tag_name('li')
    
    for li in liList:
        # 哪些 是有 有up 标签的 歌曲, F12 查看特性
        upTags = li.find_elements_by_class_name("up")
        if upTags:
    
            # 由于只要 歌曲名和 演唱者名
            title = li.find_element_by_class_name("song-title")
            titleStr = title.find_element_by_tag_name("a").text
    
            authorsStr = li.find_element_by_class_name("author_list").text
    
            print('{:10s}:{}'.format(titleStr, authorsStr))
    
    driver.quit()





    方法2

    # coding:utf8
    from selenium import webdriver
    
    driver = webdriver.Chrome(r"d:	oolswebdriverschromedriver.exe")
    # driver.implicitly_wait(1)
    # 抓取排行榜信息
    
    driver.get('http://music.baidu.com/top/new')
    
    # 层层往下查找
    div = driver.find_element_by_css_selector("#songListWrapper li")
    
    for li in liList:
        # 哪些 是有 有up 标签的 歌曲, F12 查看特性
        upTags = li.find_elements_by_class_name("up")
        if upTags:
    
            # 由于只要 歌曲名和 演唱者名
            title = li.find_element_by_class_name("song-title")
            titleStr = title.find_element_by_tag_name("a").text
    
            authorsStr = li.find_element_by_class_name("author_list").text
    
            print('{:10s}:{}'.format(titleStr, authorsStr))
    
    driver.quit()


    CSS选择器                  style属性:定义元素显示样式

    什么是CSS选择器

    内联(inline)样式          写在元素里面

    样式表(内部、外部)      写在head里

    css选择器是浏览器用来选择元素的

    执行效率高

    选择元素的方法

    根据tag名   p {color:red;}

    根据ID        #food {color:red;}

    根据class   .vagetable {color:red;}

    根据tag名和class组合写(如果多个)     span.vegetable {color:red;}

    用css选择器选择web元素

    find_element_by_css_selector

    find_elements_by_css_selector

    根据tag名    driver.find_element_by_css_selector('p')

    根据id          driver.find_element_by_css_selector('#food')

    根据class    driver.find_element_by_css_selector('.vegetable')

    后代(descendant)选择器

    选择元素内部的元素

    语法  <s1>  <s2> 

      选择s1元素里面所有的s2元素

      可以是直接子节点,也可以不是

    比如

      #choose_car option

      footer p

    可以是很多级

      ul ol li em {color:bluse;}

    如果在三个iframe从第三个回到第二个iframe也是直接定位到第二个iframeID就可以了吗?

    driver.switch_to.parent_frame()
  • 相关阅读:
    用mkdirs创建目录
    关于布局(Layout)的一切
    用HTTP操作和文件操作把网页下载到sd卡
    OpenStack计费项目Cloudkitty系列详解(一)
    OpenStack/Gnocchi简介——时间序列数据聚合操作提前计算并存储起来,先算后取的理念
    python-RabbitMQ
    1go基本语法
    openstack多region配置
    cinder 挂载卷和 iSCSI原理
    Host aggregate分区
  • 原文地址:https://www.cnblogs.com/hyzhang/p/7792211.html
Copyright © 2011-2022 走看看