# 版本
python==3.7.3
selenium==4.0.0a1
# selenium pypi地址
https://pypi.org/project/selenium/
在目錄前提示一下,有時(shí)候我們?cè)讷@取了一組元素,然后進(jìn)行循環(huán)時(shí),會(huì)報(bào)錯(cuò)'陳舊的元素.....',為了避免這個(gè)錯(cuò)誤,建議在需要處理一組元素時(shí),我們先算出元素的數(shù)量,然后通過range(element_counter),來通過索引值再次搜索需要處理的元素.
目錄:
一、初始化
二、元素查找
三、select標(biāo)簽操作
四、執(zhí)行js腳本
五、通過js操作被遮擋元素
六、iframe操作
七、動(dòng)作和動(dòng)作鏈
八、異常處理
九、顯式等待和預(yù)期條件
十、退出程序
一、初始化
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
# 新版的webdriver.chrome默認(rèn)指定了谷歌瀏覽器的驅(qū)動(dòng)程序位置,如果要自定義位置,需要實(shí)例化一個(gè)Service對(duì)象
service = Service(executable_path=revoction_config.chromedriverpath)
driver = webdriver.Chrome(service=service)
driver.implicitly_wait(5) # 隱式等待未加載的元素
driver.get('http://www.baidu.com')
# 無頭模式配置
opt = webdriver.ChromeOptions() # 創(chuàng)建chrome對(duì)象
opt.add_argument('--no-sandbox') # 啟用非沙盒模式,linux必填
opt.add_argument('--disable-gpu') # 禁用gpu,linux部署需填,防止未知bug
opt.add_argument('headless') # 啟用無頭模式
driver = webdriver.Chrome(options=opt)
driver.implicitly_wait(5) # 隱式等待未加載的元素
driver.get('http://www.baidu.com')
二、元素搜索
-
直接搜索
# 一次查找一個(gè) driver.find_element_by_id # 按id屬性 driver.find_element_by_name # 按name屬性 driver.find_element_by_xpath # 按XPath driver.find_element_by_link_text # 按 標(biāo)簽中的text過濾 driver.find_element_by_partial_link_text # 按 標(biāo)簽中的text過濾,包含某字符串的text driver.find_element_by_tag_name # 按標(biāo)簽名 driver.find_element_by_class_name # 按類屬性 driver.find_element_by_css_selector # 通過css選擇器查找 # 一次查找多個(gè)元素 (這些方法會(huì)返回一個(gè)list列表) driver.find_elements_by_name driver.find_elements_by_xpath driver.find_elements_by_link_text driver.find_elements_by_partial_link_text driver.find_elements_by_tag_name driver.find_elements_by_class_name driver.find_elements_by_css_selector
2.使用By方法.
# 使用by方法和使用"直接搜索"的方式是一樣的,只是書寫不同
from selenium.webdriver.common.by import By
driver.find_element(By.XPATH,Expression)
同等于
driver.find_element_by_xpath(Expression)
# 查找name屬性等于username的input標(biāo)簽
driver.find_element(By.XPATH,"http://input[@name='username']")
# 查看name屬性以u(píng)ser開頭的標(biāo)簽
driver.find_element(By.XPATH,"http://input[starts-with(@name,'username')]")
# 如果你搜索出來的是多個(gè)元素
driver.find_elements()
3.
XPath
XPath
有兩種搜索方式,一種是
絕對(duì)路徑
一種是
相對(duì)路徑
.
-
找到
body
中類屬性為username
的div
標(biāo)簽.# 絕對(duì)路徑示例: "/html/body/div[@class='username']" # 相對(duì)路徑示例: "http://div[@class='username']"
-
獲取
tbody
標(biāo)簽下所有的子標(biāo)簽."/table/tbody/*"
-
獲取
class
屬性為username
的<a>
標(biāo)簽后的第一個(gè)標(biāo)簽./a[@class='username']/following-sibling::li[1]
-
查看
name
屬性以user
開頭的標(biāo)簽."http://input[starts-with(@name,'username')]"
三、
select
標(biāo)簽操作(官方稱之為:
UI Support
).
from selenium.webdriver.support.select import Select
# step 1: 查找select標(biāo)簽并且示例化.
select_element = driver.find_element(By.XPATH,"http://select[@class='address']")
select = Select(select_element)
# step 2: 通過option的text文本選中
select.select_by_visible_text('北京')
四、執(zhí)行
js
腳本.
# 比如在select標(biāo)簽中你想要的option不存在
java_scripts_text = '''d = document.getElementById('address');d.options.add(new Option("{0}","{0}"));'''.format('北京')
driver.execute_script(java_scripts_text)
# 然后再實(shí)例化Select并且選擇text為北京的option即可
五、通過
js
操作被遮擋元素
baidu_button = driver.find_element(By.XPATH,"http://a[@name='baidu']")
driver.execute_script("arguments[0].click();", baidu_button)
六、
iframe
操作.
要想操作iframe里面的元素,必須先進(jìn)入iframe.
# 首先找到iframe標(biāo)簽
i = driver.find_element(By.XPATH, "http://iframe")
# 進(jìn)入iframe
driver.switch_to.frame(i)
# 退出iframe
driver.switch_to.default_content()
七、動(dòng)作和動(dòng)作鏈(官方稱之為:
Action Chains
).
-
動(dòng)作
# 在input元素中輸入text input_element = find_element(By.XPATH,"http://input[@name='username']") input_element.send_keys('xiaoming') # 點(diǎn)擊元素 a_element = find_element(By.XPATH,"http://a[@class='baidu']") a_element.click()
-
動(dòng)作鏈
from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.keys import Keys # 按住Ctrl鍵然后按鼠標(biāo)左鍵點(diǎn)擊a標(biāo)簽 a_element = find_element(By.XPATH,"http://a[@class='baidu']") ac = ActionChains(driver) # 首先移動(dòng)到a標(biāo)簽,然后按下左邊的Ctrl鍵,再點(diǎn)擊鼠標(biāo)左鍵,最后釋放左邊的Ctrl鍵,并且執(zhí)行這個(gè)動(dòng)作鏈 ac.move_to_element(a_element).key_down(Keys.LEFT_CONTROL).click().key_up(Keys.LEFT_CONTROL).perform() # 釋: key_down(): 按下某鍵 key_up(): 釋放某鍵 send_keys(): 按下并且釋放某鍵 click(): 單機(jī)鼠標(biāo)左鍵 perform(): 執(zhí)行動(dòng)作鏈
八、異常處理(官方稱之為:
Exceptions
).
異常處理的類都在
selenium.common.exceptions.*
中,要想捕捉
selenium
的異常,必須先導(dǎo)入對(duì)象的類
from selenium.common.exceptions import NoSuchElementException
try:
a_element = driver.find_element(By.PARTIAL_LINK_TEXT, '百度')
except NoSuchElementException:
print("沒有找到text為百度的a標(biāo)簽.")
九、顯式等待和預(yù)期條件.
WebDriverWait(WebDriver實(shí)例, 最長等待時(shí)間, 每次檢測(cè)時(shí)隔, 忽略的異常)
# 等待符合條件的元素加載出來,如果加載成功則返回WebElement
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
locator = (By.ID, "username")
WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))
注意: 注意你需要等待的是一組元素,則使用'presence_of_all_elements_located'實(shí)現(xiàn).
# 判斷元素是否可見并且可以點(diǎn)擊,如果可以返回元素,不可以返回False
WebDriverWait(driver, 20, 0.5).until(EC.element_to_be_clickable(locator))
可見時(shí)點(diǎn)擊
WebDriverWait(driver, 20, 0.5).until(EC.element_to_be_clickable(locator)).click()
十、退出程序.
driver.close()
driver.quit()
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
