选择、操作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:\tools\webdrivers\chromedriver.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:\tools\webdrivers\chromedriver.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()
posted @ 2017-11-07 15:11  午间小憩  阅读(180)  评论(0编辑  收藏  举报