pycharm
環境配置chrome drives.exe
,版本選擇要和chrome浏覽器版本相近放在python目錄 script
下from selenium import webdriver #創建浏覽器 driver = webdriver.Chrome() driver.get("https://www.baidu.com") #根據linktext方法定位超鏈接屬性界面字樣"新聞",看是否打開新聞超鏈接(注意link_text值用單引號) #driver.find_element_by_link_text('新聞').click() #根據partial_linktext方法定位超鏈接屬性界面模糊字樣"地",看是否打開地圖超鏈接 driver.find_element_by_partial_link_text('地').click() import time # 沉睡的目的是讓程序進行地慢一點方便觀看,有時候是等待元素渲染完成 time.sleep(5) #關閉浏覽器 #driver.quit()
a.屬性定位方式
#查找所有id=root的元素 driver.find_element_by_xpath('//*[@id="root"]
b.查找所有id值包含"con"的所有元素
注:contains()是個函數 //*[contains(@id,"con")]
c.查找所有包含id=footerLayer 且 包含class=relativeFooterLayer的所有元素
//*[@id="footerLayer" and @class="relativeFooterLayer" ]
d. 查找所有包含id=footerLayer 或者 包含class=relativeFooterLayer的所有元素
/*[@id="footerLayer" or @class="relativeFooterLayer" ]
f.查找 class以mod開頭的div屬性
//div[starts-with(@class,'mod')]
1.絕對定位
從頂層一層一層往下找對應的元素
缺點:頁面改動,絕對地址就會發生改變,將會定位錯誤
from selenium import webdriver import time #創建浏覽器 driver = webdriver.Chrome() driver.get("https://www.ctrip.com/") #使用xpath方法絕對定位點擊攜程的攻略.景點功能 driver.find_element_by_xpath('/html/body/div/div[@id="leftSideNavLayer"]/div/div/div[@style]/div/div/div/div[6]').click() #沉睡的目的是讓程序進行地慢一點方便觀看,有時候是等待元素渲染完成 sleep(2) #關閉浏覽器 driver.quit()
from selenium import webdriver import time #創建浏覽器 driver = webdriver.Chrome() driver.get("https://www.ctrip.com/") #使用xpath方法模糊定位點擊攜程的攻略.景點功能 driver.find_element_by_xpath('//body//div[@id="root"]//div[@class="lsn_first_nav_wrap_LZamG"][5]').click() #沉睡的目的是讓程序進行地慢一點方便觀看,有時候是等待元素渲染完成 sleep(2) #關閉浏覽器 driver.quit()
注意:
1.空格是跨越一級或多級元素
2.>表示下層子標簽
3.屬性:nth-child(1) ,表示相同屬性第一個
#表示id
查找所有id=ie-update的元素 #ie-update
.表示class
查找所有class=lsn_first_nav_wrap_LZamG的元素 .lsn_first_nav_wrap_LZamG
為了定位 小米note 11T pro+
的價格
#表示定位class值是brick-list clearfix的ul標簽之下的li標簽,跨越多個層級下class名為price的p標簽,下的span標簽 ul[class="brick-list clearfix"]>li p.price>span
#此操作會自動打開浏覽器,百度網址,輸入"你還好嗎","你怎麼樣了","你今天過的怎麼樣,充實嗎?"其中之一,而且加載時間會變慢五秒,完成以上結果後,會自動關閉頁面 from selenium import webdriver #創建浏覽器 driver = webdriver.Chrome() driver.get("https://www.baidu.com") #根據id屬性定位元素 #driver.find_element_by_id('kw').send_keys("你還好嗎") #根據class屬性定位元素 #driver.find_element_by_class_name('s_ipt').send_keys("你怎麼樣了") #根據name屬性定位元素 driver.find_element_by_name('wd').send_keys("你今天過的怎麼樣,充實嗎?") import time #沉睡的目的是讓程序進行地慢一點方便觀看,有時候是等待元素渲染完成 time.sleep(5) #關閉浏覽器 driver.quit()
from selenium import webdriver import time #創建浏覽器,打開百度輸入框 driver = webdriver.Chrome() driver.get("https://www.baidu.com/") #定義變量th為輸入框 th=driver.find_element_by_id('kw') #在輸入框中輸入文字,清空,再輸入 time.sleep(3) th.send_keys("說不完的話.....") time.sleep(1) th.clear() th.send_keys("你還好嗎") time.sleep(2) #關閉浏覽器 driver.quit()
百度自動上傳圖片搜索
from selenium import webdriver import time #創建浏覽器 driver=webdriver.Chrome() #浏覽器輸入百度網址 driver.get("https://www.baidu.com/") #點擊上傳按鈕 driver.find_element_by_xpath('/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/span[1]').click() #點擊選擇文件 driver.find_element_by_xpath('/html/body/div[1]/div[1]/div[5]/div/div/form/div/div[2]/div[2]/input').send_keys('C:\\Users\\hhh\\Desktop\\百度元素.png') time.sleep(6) driver.quit()
在f12下console下輸入以下代碼
#因為日期每月的每天位置都不一樣,所以引入了document.querySelector()方法 #來查找class名為td的標簽中的id值是"June-29-2022" #所以若想點擊其他日期,直接改變id值就行 document.querySelector('[class="pi-input J_DepDate has-trans trigger-node-406"]').placeholder="2022-3-15"
在python下執行javaScript格式
driver.execute_script('document.querySelector(\'[class="pi-input J_DepDate has-trans trigger-node-406"]\').placeholder="2022-3-15"')
from selenium import webdriver import time #創建浏覽器,打開百度輸入框 driver = webdriver.Chrome() driver.get("https://www.baidu.com/") #在輸入框中搜索 driver.find_element_by_id('kw').send_keys("hello,world") time.sleep(2) #點擊搜索 driver.find_element_by_id('su').click() #點擊文本的百度百科 driver.find_element_by_xpath('//div[@class="bk_polysemy_1Ef6j"]//a').click() time.sleep(5) #獲取所有的浏覽器窗口 windows=driver.window_handles #選中第二個新開的浏覽器窗口 driver.switch_to.window(windows[-1]) #切換到第一個浏覽器窗口 driver.switch_to.window(windows[0])
為什麼要切換ifame
原因是網頁嵌套一個網頁,不切換ifame,定位不到元素
from selenium import webdriver import time #創建浏覽器,打開阿裡雲注冊界面 driver = webdriver.Chrome() driver.get("https://account.aliyun.com/register/qr_register.htm") #定義一個變量frame ,值是定位frame元素 frame = driver.find_element_by_id('alibaba-register-box') #切到html下frame頁面 driver.switch_to.frame(frame) #在注冊界面賬號欄輸入賬號 driver.find_element_by_xpath('//div[@class=" next-form-item-control"]//input').send_keys("17655870668") #在注冊界面賬號欄輸入密碼 driver.find_element_by_xpath('//div[@class="pwd-wrap"] //input[@type="password"]').send_keys("edwdaf") #再次切換到frame外層 driver.switch_to.parent_frame() time.sleep(3) driver.quit()
from selenium import webdriver import time #創建浏覽器 driver = webdriver.Chrome() #打開我的本地彈窗html文件 driver.get("E:\\python_pro\\venv\\1.html") #定義一個變量用於彈出的alert窗口 alert = driver.switch_to.alert print(alert.text) time.sleep(3) driver.quit()
from selenium import webdriver import time #引入 ActionChains類 from selenium.webdriver.common.action_chains import ActionChains #創建浏覽器 driver = webdriver.Chrome() #打開京東界面 driver.get("https://www.jd.com") time.sleep(3) #定義一個變量m用於接收"網站導航"定位 m = driver.find_element_by_xpath('//*[@aria-label="網站導航"]') #傳入變量m,並使鼠標懸停在"網站導航" ActionChains(driver).move_to_element(m).perform()#perform()方法代表執行的意思 time.sleep(3) #定義一個變量x用於接收"京東通信"定位 x = driver.find_element_by_xpath('//a[@role="menuitem" and text()="京東通信"]') #傳入變量x,並使鼠標點擊懸停在"網站導航"的"京東通信"子頁面 ActionChains(driver).move_to_element(x).click().perform() time.sleep(3) driver.quit()
from selenium import webdriver import time #引入 ActionChains類 from selenium.webdriver.common.action_chains import ActionChains #創建浏覽器 driver = webdriver.Chrome() action= ActionChains(driver) #打開地圖界面 driver.get("https://map.baidu.com/@11590057.96,4489812.75,4z") time.sleep(6) time.sleep(3) #定位地圖的定位 u=driver.find_element_by_xpath('//*[@type="system"]') # move_to_element(mask)移動到這個元素,click_and_hold()按下鼠標,move_by_offset(50,30)偏移量拖動,release()松開鼠標,perform()執行操作 action.move_to_element(u).click_and_hold().move_by_offset(50,30).release().perform() time.sleep(3) driver.quit()
為了解決一段時間頁面彈出登錄窗口
from selenium import webdriver import time #引入 ActionChains類 from selenium.webdriver.common.action_chains import ActionChains #創建浏覽器 driver = webdriver.Chrome() #隱式等待頁面元素時間(0-15s) driver.implicitly_wait(15) #打開地圖界面 driver.get("https://map.baidu.com/@11590057.96,4489812.75,4z") #記錄開始時間 start_time = time.perf_counter() #點擊賬號輸入 driver.find_element_by_xpath('//*[@name="userName"]').send_keys('1321454654') #點擊密碼輸入 driver.find_element_by_xpath('//*[@name="password"]').send_keys('zawwe343234') #點擊登錄 driver.find_element_by_xpath('//*[@value="登錄"]').click() action= ActionChains(driver) #定位地圖的定位 u=driver.find_element_by_xpath('//*[@type="system"]') # move_to_element(mask)移動到這個元素,click_and_hold()按下鼠標,move_by_offset(50,30)偏移量拖動,release()松開鼠標,perform()執行操作 action.move_to_element(u).click_and_hold().move_by_offset(50,30).release().perform() time.sleep(3) driver.quit()
可以控制單個元素等待時間
from selenium import webdriver import time #引入顯示等待函數 import selenium.webdriver.support.expected_conditions as EC from selenium.webdriver.common.by import By #創建浏覽器 driver = webdriver.Chrome() #打開地圖界面 driver.get("https://map.baidu.com/@11590057.96,4489812.75,4z") #記錄開始時間 #start_time = time.perf_counter() WebDriverWait(driver,5).until(EC.presence_of_element_located(By.CSS_SELECTOR,'//*[@name="userName"]')) #記錄結束時間 #end_time = time.perf_counter() #print(f'{end_time - start_time} s') #點擊賬號輸入 driver.find_element_by_xpath('//*[@name="userName"]').send_keys('345761231') #點擊密碼輸入 driver.find_element_by_xpath('//*[@type="password" and @name="password"]').send_keys('21323dwe') # time.sleep(3) # driver.quit()
1.自動填寫登錄csdn
from selenium import webdriver import time #創建浏覽器 driver=webdriver.Chrome() #浏覽器輸入csdn網址 driver.get("https://www.csdn.net/?spm=1000.2115.3001.4476") #找到超鏈接文本登錄/注冊,然後點擊 driver.find_element_by_link_text('登錄/注冊').click() #點擊登錄方式-密碼登錄 driver.find_element_by_xpath('/html/body/div[2]/div/div[2]/div[2]/div[1]/div[1]/div[1]/span[4]').click() #輸入csdn賬號 driver.find_element_by_xpath('/html/body/div[2]/div/div[2]/div[2]/div[1]/div/div[2]/div/div[1]/div/input').send_keys('賬號') #輸入csdn密碼 driver.find_element_by_xpath('/html/body/div[2]/div/div[2]/div[2]/div[1]/div/div[2]/div/div[2]/div/input').send_keys('密碼') #登錄 driver.find_element_by_xpath('/html/body/div[2]/div/div[2]/div[2]/div[1]/div/div[2]/div/div[4]/button').click() time.sleep(10) driver.quit()
from selenium import webdriver import time #引入 ActionChains類 from selenium.webdriver.common.action_chains import ActionChains #創建浏覽器 driver = webdriver.Chrome() #隱式等待頁面元素時間(0-15s) driver.implicitly_wait(5) #打開地圖界面 driver.get("https://map.baidu.com/@11590057.96,4489812.75,4z") #記錄開始時間 #start_time = time.perf_counter() #點擊賬號輸入 driver.find_element_by_xpath('//*[@name="userName"]').send_keys('423425465') #點擊密碼輸入 driver.find_element_by_xpath('//*[@type="password" and @name="password"]').send_keys('8vsdrw5') # 點擊登錄 driver.find_element_by_xpath('//*[@value="登錄" and @type="submit"]').click() #記錄結束時間 #end_time = time.perf_counter() #print(f'{end_time - start_time} s') action = ActionChains(driver) #定位地圖的定位 u=driver.find_element_by_xpath('//*[@type="system"]') #move_to_element(mask)移動到這個元素,click_and_hold()按下鼠標,move_by_offset(50,30)偏移量拖動,release()松開鼠標,perform()執行操作 action.move_to_element(u).click_and_hold().move_by_offset(50,30).release().perform() # time.sleep(3) # driver.quit()