關於Python+selenium 定位瀏覽器彈窗元素


首先要確定彈窗的類型:

(1)div彈窗

(2)新標簽頁彈窗

(3)alert彈窗

一,div彈窗
div彈窗是瀏覽器中比較好定位的彈窗,定位的方法與普通的元素一樣。不過這里會有一個坑,明明可以找到這個按鈕,但是就是定位不到。這個就是因為當前有div彈窗彈出的時候,需要設置一下等待時間,等頁面元素加載完畢,再去做其他操作。
這里用百度登陸為例子:

 1 from selenium import webdriver
 2 import time
 3 
 4 def login_baidu(url,username,password):
 5     driver.get(url)
 6     driver.find_element_by_xpath('//*[@id="u1"]/a[7]').click()
 7     time.sleep(2)
 8     driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__footerULoginBtn"]').click()
 9     time.sleep(2) # 彈窗出現后,使頁面等待2S
10 
11     login_username = driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__userName"]')
12     login_username.click()
13     login_username.send_keys(username)
14 
15     login_passwork = driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__password"]')
16     login_passwork.click()
17     login_passwork.send_keys(password)
18 
19     driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__submit"]').click() # 登陸按鈕
20 
21 if __name__ == "__main__":
22     driver = webdriver.Firefox()
23     username = r'xxx@qq.com'
24     password = r'xxxx'
25     url = r'https://www.baidu.com'
26     login_baidu(url,username,password)

二,新標簽頁彈窗
新標簽頁彈窗,則需要進行窗口的切換。此處第一個窗口打開百度首頁,在打開一個新窗口打開京東首頁,在兩個窗口之間進行切換。切換到不同的窗口之后,就可以用常規的方法進行元素的定位。

 1 from selenium import webdriver
 2 import time
 3 
 4 def open_window1():
 5    driver.get("https://www.baidu.com")
 6    time.sleep(2)
 7 
 8 def open_window2(): # 用JS的方法打開新窗口,模擬新標簽頁彈窗
 9     js = "window.open('https://www.jd.com')"
10     driver.execute_script(js)
11     time.sleep(2)
12 
13 def Switch_Window():
14     handles = driver.window_handles
15     print("打印當前已打開的窗口:"+str(handles))
16     while(1): # 在兩個窗口之間做切換動作
17         driver.switch_to.window(handles[0])
18         time.sleep(5)
19         driver.switch_to.window(handles[1])
20         time.sleep(5)
21 
22 if __name__ == "__main__" :
23     driver = webdriver.Firefox()
24     open_window1()
25     open_window2()
26     Switch_Window()

handles = driver.window_handles # 獲取當前打開的所有窗口的句柄
driver.switch_to.window(handles[N]) # 切換到其中一個窗口
其中,獲取的句柄下標從0開始,即第一個窗口為[0]、第二個窗口為[1],如此類推。使用switch_to.window方法切換到新標簽頁后就可以做其他操作了。

三、alert彈窗

在WebDriver中處理JS所生成的alert、confirm以及prompt十分簡單,具體做法是使用switch_to.alert()方法定位到alert/confirm/prompt,然后使用text/accept/dismiss/send_keys等方法進行操作。

1.text:返回alert/confirm/prompt中的文字信息。

2.accept():接受現有警告框。

3.dismiss():解散現有警告框。

4.send_keys(keysToSend):發送文本至警告框。 keysToSend:將文本發送至警告框。

 

如圖所示,百度搜索設置彈出的窗口是不能通過前端工具對其進行定位的,這個時候就可以通過switch_to.alert()方法接受這個彈窗。

 

代碼如下:

 1 #導包
 2 from selenium import webdriver
 3 from selenium.webdriver.common.action_chains import ActionChains
 4 from time import sleep
 5 #定義瀏覽器句柄,打開百度網頁
 6 driver=webdriver.Chrome()
 7 driver.implicitly_wait(10)
 8 url="http://www.baidu.com"
 9 driver.get(url)
10 #鼠標懸停至"設置"連接
11 link=driver.find_element_by_link_text('設置')
12 ActionChains(driver).move_to_element(link).perform()
13 #打開搜索設置
14 driver.find_element_by_link_text('搜索設置').click()
15 #保存設置
16 sleep(2)
17 driver.find_element_by_xpath('//*[@id="gxszButton"]/a[1]').click()
18 sleep(3)19 #接受警告框
20 alert=driver.switch_to.alert
21 print(alert.text)
22 alert.accept()
23 #20和22行合並,可以直接寫成: driver.switch_to.alert.accept()
24 sleep(2)
25 driver.quit()

 

------------------------------------------------------------------------------------------------

talk is cheap,show me the code.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM