web自動化主要做的事情:
1. 選擇界面元素
2.操作界面元素(a> 輸入操作:點擊,輸入文字,拖拽等 b> 輸出操作:獲取元素的各種屬性)
3.根據界面上獲取的數據進行分析和處理
根據這樣的特性,因此能正確定位到頁面的元素是最重要的,下面介紹幾種定位元素的方法,講之前先說一下selenium常用的兩種書寫方式。
a > element = driver.find_element_by_id("kw")
b > from selenium.webdriver.common.by import By
element = driver.find_element(by = By.ID,value = "kw")
c > 返回多個值,值使用elements,返回值為列表list,每一種元素定位的返回值,都可能存在多個值的返回
1. 通過id選擇元素,唯一的
element=driver.find_element_by_id("kw")
2. 通過name選擇元素
<input name="sheese" type="text"/>
element = driver.find_element_by_name("sheese")
3. 通過class選擇元素
<div class="cheese"><span>cheddar</span></div>
<dic class="cheese"><span>gouda</span></div>
find_elements_by_class_name("cheese") - - 返回了多個,使用elements - - list
4. 通過tag名選擇元素
tag就是標簽名
<iframe src="..."></iframe>
element = driver.find_element_by_tag_name("iframe")
from selenium.webdriver.common.by import By
frame = driver.find_element(By.TAG_NAME,"iframe")
5. 通過鏈接文本選擇元素
<a href="http:www.baidu.com">轉到百度</a>
a > 全鏈接文本
ele = driver.find_element_by_link_text(u"轉到百度")
b > 部分鏈接文本
也可以通過部分文本去找到該鏈接元素
ele = driver.find_element_by_partial_link_text(u"百度")
6. CSS選擇器:空格代表子元素,>代表直接子元素
針對CSS中的nth-child比較常用:詳細介紹可以參考:https://www.jianshu.com/p/5c9ebb4d8e53
CSS選擇器是瀏覽器用來選擇元素的,執行效率高,因為有些樣式是通過CSS來實現的。
兩種展示方式:
返回單個值: find_element_by_css_selector
返回多個值: find_elements_by_css_selector
a> CSS選擇元素的方法tag
driver.find_elements_by_css_selector('p')
b> CSS選擇元素的方法id : 格式(#id名)
driver.find_elements_by_css_selector('#food')
c> CSS選擇元素的方法class:格式(.)
<span class="vegetable good">黃瓜</span>
driver.find_elements_by_css_selector('.vegrtable')
driver.find_elements_by_css_selector('.food')
d> 后代(descendant)選擇器, 可以是間接子節點,之間用空格
格式 : <s1><s2>
選擇s1元素里面所有s2元素;
可以是直接子節點,也可以不是;
》 #choose_car option : 選擇id是choose_car下面的子節點option
》 footer p : 選擇tag名為footer下的子節點,tag名為p
》 ul ol li em {color:blue;}:選擇ul下ol下li下em下屬性為{color:blue;}
不是很明白的話,可以看下面的這段示例,會讓你更加明了。。。。。。
直接子元素:
<select id="choose_car">
<option value = "volue">A</option>
<option value = "corolla">B</option>
<option value = "audi">C</option>
</select>
eles = driver.find_elements_by_css_selector('#choose_car option') -- id 為“choose_car” 下面option子節點
間接子元素:
<footer>
<div>
<p>test1</p>
<div>
</footer>
ele = driver.find_element_by_css_selector('footer p') -- 選擇tag標簽名為"footer",下面的間接子節點的tag為p的
e> 子元素(child)選擇器,必須是直接子節點,之間用 >
例如后代選擇器: #choose_car option -- 表示可以是間接子節點,也可以是直接子節點
子元素:#choose_car > option
footer > p
很多級:ul > ol > li > em
f> 組(group)選擇: 同時選擇多個元素,逗號隔開
語法:<s1>,<s2>
例如: p,button
#food, .cheese
三種常用的示例:
選擇id為food的所有span子元素和所有的p(包含非food的子元素)
#food > span,p
選擇id為food的所有span子元素和所有的p子元素
#food > span , #food > p
選擇id為food的所有子元素
#food > *
g> 兄弟節點
選擇緊接在另一個元素后的元素,二者有相同的父元素
#food + fiv
#many > div > p.special + p
選擇在另一個元素后的元素,二者具有相同的父元素
#food ~ div
屬性選擇器:
7. xpath選擇
驗證css表達式:可以在F12下選擇Console:$$('表達式')
驗證xpath表達式:$x('表達式')
a > // : 相對路徑 /:絕對路徑
選擇整個文檔中所有的option節點,不管什么位置
//div//p :表示選擇所有的div元素里面的p元素,不管div在什么位置,不管p元素在div下面的什么位置
//div//p :就等於css選擇器的寫法 :div p
b > 通配符
//*[contains(@class,'good')] -- 頁面上所有元素屬性class包含good的值
//p[@class='len'] -- 頁面上所有p元素下class='len'的值
//*[@class] -- 頁面上所有具有class屬性的
c > 選擇匹配到的某一個
//*[@id="choose_car"]/option[1]: 下標是從1開始的,找到id=choose_car下的option中的第一個
last() : 最后幾個
//*[@id='choose_car']/option[last()-n]: 匹配倒數第n個
position() : > = != < 匹配哪幾個
//*[@id='choose_car']/option[position()=4]: 匹配到第四個
//*[@id='choose_car']/option[position()>=2]:從第二個開始,大於等於2的所有元素
區間 ://*[@id='choose_car']/option[position>=last()-1]: 選擇后面二個
d > 組選擇器 使用|分開
//p | //button
//*[@id='choose_car/option[position()>=last()-1]' | footer | //div/p]
e > 兄弟元素
following-sibling:: 可以選擇后面的兄弟節點
//*[@id="food"/following-sibling::div[1]]:選找到id=food的下div的兄弟節點,中的第一個div或者最后一個last()
//*[@id="food"]/following-sibling::div[last()]
//*[@id="food"]/following-sibling::div[position()<last()]
preceding-sibling::div 可以選擇前面的兄弟節點
//*[@id="food"]/preceding-sibling::div選取前面的兄弟節點
f > 選擇父節點
.. 符號
需要在某一個已經查找出來的html里面找其他元素,必須//前面加一個點.
目前就這么多的方法,后面寫一些selenium的一些操作,和找到元素后的操作。。。。。