选择、操作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 webdriverdriver = 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 webdriverdriver = 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()轉載于:https://www.cnblogs.com/hyzhang/p/7792211.html
總結
以上是生活随笔為你收集整理的选择、操作web元素-2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PADS Win10软件卡死问题解决
- 下一篇: nodejs微信公众号教程