1.1概要
大家好扎唾!我是lamecho(辣么丑)盔性,上一篇我們搭建好python運(yùn)行selenium的環(huán)境后划址,接下來當(dāng)然是來看看怎么去使用它了。其實(shí)selenium在操作上和appium是很像的掖桦,第一步都是要找元素本昏,通過定位到元素后再去執(zhí)行動作。好枪汪,下面我們將方法穿插到實(shí)戰(zhàn)中來做演示涌穆。
1.2 selenium實(shí)戰(zhàn)百度頁面
在進(jìn)入實(shí)戰(zhàn)前,我們先拋開selenium去談?wù)?a target="_blank" rel="nofollow">web頁面雀久。首先我們查找頁面元素的方法是直接可以在瀏覽器中完成的宿稀,本文將以chrome瀏覽器為例,
上圖是瀏覽器的截圖赖捌,按F12可以打開如上圖的調(diào)試工具祝沸,在定位元素上通過紅框圈起來的工具可以很方便的定位元素在頁面源碼的位置。我這里要說的是巡蘸,如何做好web頁面的自動化測試奋隶,前提就是要學(xué)會分析我們的網(wǎng)頁源碼,了解我們元素在頁面源碼中的依存關(guān)系悦荒。為什么要這么說,因?yàn)楹芏鄷r候我們都會碰到這樣的問題嘹吨,明明頁面上有這個元素為什么我在腳本里去查找就是報錯呢搬味?
下面我先介紹幾個定位元素的方法,相對于appium文章中介紹的常用方法蟀拷,selenium中用到的會相對豐富一些碰纬。
browser.find_element_by_id()/browser.find_elements_by_id()
browser.find_element_by_tag_name()/browser.find_elements_by_tag_name()
browser.find_element_by_xpath()/browser.find_elements_by_xpath()
browser.find_element_by_link_text()/browser.find_elements_by_link_text()
大家不要感覺少,畢竟我在appium里只介紹了2個问芬,這里有4個了悦析。下面我們先來分析一下我們定位到的頁面“登錄“元素的源碼,我們可以得到哪些信息呢此衅?
登錄
1可以知道該元素的標(biāo)簽强戴,tagname是亭螟,并帶有鏈接屬性href
結(jié)論:(1)我們可以通過find_element_by_tag_name去定位;
(2)我們可以通過find_element_by_link_text()去定位骑歹;
2在標(biāo)簽里可以知道包含的屬性有href预烙,name,class等幾個屬性
結(jié)論:可以通過get_attribute()方法獲取這些屬性道媚,幫助我們進(jìn)一步定位
3可以看到這個元素的text值是“登錄“
結(jié)論:可以通過.text獲取元素的text值扁掸,幫助我們進(jìn)一步定位
我希望大家在剛開始學(xué)習(xí)selenium時,都要學(xué)會這樣去分析我們要找的頁面元素最域,因?yàn)橹挥惺煜ち嗽卦陧撁嬖创a的表現(xiàn)形式及它的上下文的依存關(guān)系谴分,我們在定位元素上就會有的放矢,不會出現(xiàn)查找不到的問題了镀脂。
廢了那么多話狸剃,我們終于要進(jìn)入實(shí)戰(zhàn)了。先說說我們將要執(zhí)行的動作狗热,打開百度首頁后钞馁,操作登錄,并在彈出的登錄框中輸入用戶名匿刮,密碼進(jìn)行登錄操作僧凰。
# -*-encoding:utf-8 -*-
from selenium import webdriver
browser=webdriver.Firefox()
browser.maximize_window()
browser.get("https://www.baidu.com/")
#1
browser.implicitly_wait(10)
browser.find_element_by_xpath('//div[@id="u1"]/a[7]').click()
#2
#browser.find_element_by_link_text(u'登錄').click()
#3
'''
els=browser.find_elements_by_tag_name('a')
for i in els:
if i.text==u'登錄':
i.click()
break
'''
browser.implicitly_wait(10)
browser.find_element_by_id('TANGRAM__PSP_8__userName').send_keys('test')
browser.find_element_by_id('TANGRAM__PSP_8__password').send_keys('test')
browser.find_element_by_id('TANGRAM__PSP_8__submit').click()
sleep(10)
browser.quit()
通過腳本對照我們之前對“登錄“元素的源碼分析,我在這里通過三種方式去實(shí)現(xiàn)了對”登錄“的點(diǎn)擊熟丸。#1是通過xpath查找训措,我們看看下面的截圖,了解xpath的使用方式光羞。
browser.find_element_by_xpath('//div[@id="u1"]/a[7]').click()
首先大家要記住xpath的寫法绩鸣,//div[@id="u1"]是通過一個父層級來定位,對照源碼可以清楚的看到登錄所在的標(biāo)簽的上一層級
browser.find_element_by_link_text(u'登錄').click()
再來看看這樣的寫法,由于我們的“登錄“是個鏈接倒信,所以就可以通過link_text去定位科贬。
els=browser.find_elements_by_tag_name('a')
for i in els:
if i.text==u'登錄':
i.click()
break
而第三種寫法,就稍微復(fù)雜了一點(diǎn)鳖悠。首先它是通過by tagname去找到所有tagname是a的元素集合榜掌,然后我們在循環(huán)里找到a標(biāo)簽里text值等于“登錄“的標(biāo)簽進(jìn)行點(diǎn)擊优妙。
接下來我們看看最后對彈出登錄框的操作
browser.implicitly_wait(10)
browser.find_element_by_id('TANGRAM__PSP_8__userName').send_keys('test')
browser.find_element_by_id('TANGRAM__PSP_8__password').send_keys('test')
browser.find_element_by_id('TANGRAM__PSP_8__submit').click()
可以看到3個元素都是通過id去查找,并在找第一個input時用到了智能等待語句唐责×鄹龋看到這里對selenium有過學(xué)習(xí)了解的同學(xué)可能會問了,這三個元素不是在彈出框里嗎鼠哥,怎么沒有先去將我們的browser切換到彈出框再去查找框里的元素呢熟菲?在這里我要提醒大家一下,之前培訓(xùn)很多人都會問到這個問題朴恳,具體問題要具體對待抄罕,就想文章開頭講的在找元素時要先分析元素的頁面源碼,百度頁面這個彈出框在源碼中它的依存關(guān)系始終都是在原頁面上于颖,意思就是我們不需要去切換現(xiàn)有的browser呆贿。另外在時間的等待上建議大家回頭看看我在《python自動化測試應(yīng)用-第3篇(APP測試)--Appium元素篇》談到的時間問題,在實(shí)際的工作中我們的自動化腳本中在界面切換時是不應(yīng)該出現(xiàn)sleep去做等待的森渐,而智能等待implicitly_wait()有時候也不能很好的處理做入。那么有沒有什么好的方法呢,當(dāng)然有了不過單純的使用selenium提供的方法就顯得捉襟見肘了同衣。在下一篇竟块,selenium使用進(jìn)階篇我將給大家闡述我的方法。
1.3元素篇—結(jié)束
怎么樣耐齐,看完這篇大家是不是對元素的查找有了初步的認(rèn)識呢浪秘,在接下來的一篇文章中,我將帶大家進(jìn)入selenium的進(jìn)階使用埠况,如何操作下拉列表耸携,如何在頁面中使用js腳本,如何在頁面上執(zhí)行鍵盤操作辕翰,以及對待frame應(yīng)該怎么找元素夺衍,瀏覽器頁面跳轉(zhuǎn)到新的tab后如何在新的tab中繼續(xù)我們的腳本等等干貨。
感謝大家耐心讀完金蜀,我是lamecho辣么丑刷后。
原創(chuàng)文章,轉(zhuǎn)載請注明出處渊抄。新浪微博搜索 “lamecho好棒” 歡迎大家來撩。
微博:https://weibo.com/u/6017986584