今天繼續講知識點,關於切換,因為我們在元素定位的時候,明明在網頁下面f12可以定位到,但是就是寫代碼的時候發現不行,今天的切換就可以解決這個問題
一、iframe切換
先拋出一個問題:
1.1方式一:通過iframe標簽的name屬性進行切換
import time from selenium.webdriver import Chrome from selenium.webdriver.common.by import By driver = Chrome() driver.implicitly_wait(10) driver.get('https://qzone.qq.com/') # 方式一:通過iframe標簽的name屬性進行切換 driver.switch_to.frame("login_frame") driver.find_element(By.ID, 'switcher_plogin').click() time.sleep(3) # 待3秒后退出 driver.quit()
1.2方式二:先定位iframe,通過定位到的元素進行切換
先定位iframe,通過定位到的元素進行切換 import time from selenium.webdriver import Chrome from selenium.webdriver.common.by import By driver = Chrome() driver.implicitly_wait(10) driver.get('https://qzone.qq.com/') # 方式二:先定位iframe,通過定位到的元素進行切換 login_frame = driver.find_element(By.XPATH, '//iframe[@id="login_frame"]') driver.switch_to.frame(login_frame) driver.find_element(By.ID, 'switcher_plogin').click() time.sleep(3) # 待3秒后退出 driver.quit()
1.3方式三:通過iframe標簽的下標索引位置,進行切換
import time from selenium.webdriver import Chrome from selenium.webdriver.common.by import By driver = Chrome() driver.implicitly_wait(10) driver.get('https://qzone.qq.com/') # 方式三:通過iframe標簽的下標索引位置,進行切換 driver.switch_to.frame(0) driver.find_element(By.ID, 'switcher_plogin').click() time.sleep(3) # 待3秒后退出 driver.quit()
其他:如何從iframe中切換到原來的頁面中
二、窗口切換
2.1切換進入新的窗口
打開一個新的窗口后,怎么在新的窗口標簽頁中,才有效?
import time from selenium.webdriver import Chrome from selenium.webdriver.common.by import By driver = Chrome() driver.implicitly_wait(10) # 打開百度 driver.get('https://www.baidu.com/') # 在百度的輸入框輸入58同城,並點擊百度一下按鈕 driver.find_element(By.ID, 'kw').send_keys("58同城") driver.find_element(By.ID, 'su').click() # 選擇百度頁面搜索結果的第一個進行點擊,進入新的窗口 driver.find_element(By.XPATH, "//a[@data-url='http://www.58.com']").click() # 獲得所有窗口的句柄 all_handles = driver.window_handles # 通過獲取句柄的方式切換到新打開的58同城窗口 driver.switch_to.window(all_handles[-1]) # 在新的窗口鏈接中(也就是打開的58同城頁面中)的搜素框中輸入python driver.find_element(By.XPATH, "//input[@id='keyword']").send_keys("python") time.sleep(3) # 待3秒后退出 driver.quit()
2.2兩個窗口之間的切換
比如,從新的窗口中切回去,怎么辦?
import time from selenium.webdriver import Chrome from selenium.webdriver.common.by import By driver = Chrome() driver.implicitly_wait(10) # 打開百度 driver.get('https://www.baidu.com/') # 在百度的輸入框輸入58同城,並點擊百度一下按鈕 driver.find_element(By.ID, 'kw').send_keys("58同城") driver.find_element(By.ID, 'su').click() # 選擇百度頁面搜索結果的第一個進行點擊,進入新的窗口 driver.find_element(By.XPATH, "//a[@data-url='http://www.58.com']").click() # 獲得所有窗口的句柄 all_handles = driver.window_handles # 通過獲取句柄的方式切換到新打開的58同城窗口 driver.switch_to.window(all_handles[-1]) # 在新的窗口鏈接中(也就是打開的58同城頁面中)的搜素框中輸入python driver.find_element(By.XPATH, "//input[@id='keyword']").send_keys("python") # 如果我要返回原來的窗口,怎么切換?目前我這里只有兩個窗口 # 選擇句柄為第一個位置的,切回去 driver.switch_to.window(all_handles[0]) # 運行結果,此時已經顯示原來的網頁 time.sleep(3) # 待3秒后退出 driver.quit()
2.3多個窗口的切換
如果在項目需求中,需要打開打開多個窗口,並不停的在多個網頁之間來回切換,這種用代碼如何來處理?
import time from selenium.webdriver import Chrome from selenium.webdriver.common.by import By driver = Chrome() driver.implicitly_wait(10) # 打開百度 driver.get('https://www.baidu.com/') # 在百度的輸入框輸入58同城,並點擊百度一下按鈕 driver.find_element(By.ID, 'kw').send_keys("58同城") driver.find_element(By.ID, 'su').click() # 記錄當前百度輸入58的句柄 baidu_58_handle = driver.current_window_handle # 選擇百度頁面搜索結果的第一個進行點擊,進入新的窗口 driver.find_element(By.XPATH, "//a[@data-url='http://www.58.com']").click() # 獲得所有窗口的句柄 all_handles = driver.window_handles # 通過獲取句柄的方式切換到新打開的58同城窗口 driver.switch_to.window(all_handles[-1]) # 在新的窗口鏈接中(也就是打開的58同城頁面中)的搜素框中輸入python driver.find_element(By.XPATH, "//input[@id='keyword']").send_keys("python") time.sleep(2) # 記錄點擊第一個58同城的句柄 no1_58_handle = driver.current_window_handle # 如果我要返回原來的窗口,怎么切換? driver.switch_to.window(baidu_58_handle) # 運行結果,此時已經顯示原來的網頁 # 那么我選擇原來網頁的其他的搜索結果進行點擊,比如我選擇下面的58同城找工作網 driver.find_element(By.XPATH, "//div[@id='5']").click() # 這里進行窗口切換,-1是最新的那個 driver.switch_to.window(all_handles[-1]) # 記錄找工作58網的句柄 job58_handle = driver.current_window_handle # 接下來,想怎么切就怎么切換,只要前面有記錄就可以 driver.switch_to.window(baidu_58_handle) driver.switch_to.window(no1_58_handle) driver.switch_to.window(job58_handle) time.sleep(5) # 待3秒后退出 driver.quit()
三、alert切換
在做項目的時候,偶爾會碰到一些alert彈窗,這種情況,如何來切換進入后對其進行操作呢?
""" alert彈窗切換:driver.switch_to.alert alert_object = driver.switch_to.alert alert_object的方法: accept():點擊確定 dismiss():點擊取消 send_keys():如果alert彈窗中有輸入框,則可以使用該方法 alert_object的屬性: text:彈出的文本內容 """ import time from selenium.webdriver import Chrome from selenium.webdriver.common.by import By driver = Chrome() driver.implicitly_wait(10) # 出現alert彈窗 driver.get(r'D:\pythonProject\web_05day\alert彈窗演示.html') driver.find_element(By.ID, 'btn').click() time.sleep(1) # 等1秒鍾看效果 # 先切換進入彈窗,再按確認按鈕 alert_object = driver.switch_to.alert alert_object.accept() # 彈窗上的取消按鈕,我這里把它寫成了一行 # driver.switch_to.alert.dismiss() driver.find_element(By.ID, 'user').send_keys("Excellent") time.sleep(3) # 待3秒后退出 driver.quit()