轉載出處:https://www.jianshu.com/p/5af3974c40c7
126郵箱實例
開頭雞湯:不忘初心,方得始終。
測試環境搭建:
Python3.5版本 下載地址:https://www.python.org/
selenium3.11版本 通過pip install selenium ==3.11下載的selenum版本(最好用這種方式指定對應版本)
Firfox57版本
Firfox57安裝包:https://pan.baidu.com/s/13NjOHte5b1Gq_p-OiyrN9Q
Firfox57驅動: https://github.com/mozilla/geckodriver/releases(V0.21.0版本)
驅動版本截圖:

實例部分:
使用Firefox57打開網址 https://mail.126.com/ 使用F12打開輔助定位工具,通過定位發現登錄框實際是在iframe里,瀏覽器每次打開界面,id都是不一樣的,動態id的特征是后續增加了許多數字,例如:

非動態的iframe可以通過以下方式定位
有id,並且唯一,直接寫id
driver.switch_to_frame("x-URS-iframe")
driver.switch_to.frame("x-URS-iframe")(較新版本推薦使用方法)
有name,並且唯一,直接寫name
driver.switch_to_frame("xxxx")
driver.switch_to.frame("xxxx") (較新版本推薦使用方法)
無id,無name,先定位iframe元素
iframe = driver.find_elements_by_tag_name("iframe")[0]
driver.switch_to_frame(iframe)
driver.switch_to.frame(iframe) (較新版本推薦使用方法)
如果是動態Id需要借助xpath部分元素屬性定位,xpath中提供了三個非常好的方法來為我們定位部分屬性值:
driver.find_element_by_xpath
("//div[contains(@id, 'btn-attention')]")
driver.find_element_by_xpath
("//div[starts-with(@id, 'btn-attention')]")
driver.find_element_by_xpath
("//div[ends-with(@id, 'btn-attention')]")
# 這個需要結尾是‘btn-attention’
contains(a, b) 如果a中含有字符串b,則返回true,否則返回false
starts-with(a, b) 如果a是以字符串b開頭,返回true,否則返回false
ends-with(a, b) 如果a是以字符串b結尾,返回true,否則返回false
代碼如下:
#引入模塊
from selenium import webdriver
#引入時間模塊
import time
#實例化驅動對象
driver = webdriver.Firefox()(把驅動放到python的script可以正常調用使用這種寫法)
driver = webdriver.Firefox(executable_path=r'F:\Python\Scripts\geckodriver.exe')(找不到驅動可以通過寫路徑的方式來調用)
#打開126郵箱
driver.get("https://mail.126.com/")
#瀏覽器最大化
driver.maximize_window()
#休眠3秒,方式刷新不出來。
time.sleep(3)
#根據xpath定位ifram表單
driver.switch_to.frame(driver.find_element_by_xpath("//iframe[starts-with(@id, 'x-URS-iframe')]"))
#定位輸入賬號
driver.find_element_by_name("email").send_keys("xxxxxxxx")
#定位輸入密碼
driver.find_element_by_name("password").send_keys("xxxxxxxx")