1. 程式人生 > 其它 >Selenium之定位彈窗元素

Selenium之定位彈窗元素

發現瀏覽器中有一些彈窗元素,無法定位。經過自己的摸索,總結一些心得,供日後回顧:
首先要確定彈窗的型別:
(1)div彈窗
(2)新標籤頁彈窗
(3)alert彈窗
(4)confirm彈窗
(4)prompt彈窗

DIV彈窗

像這種DIV彈框,div彈窗是瀏覽器中比較好定位的彈窗,定位的方法與普通的元素一樣。不過這裡會有一個坑,明明可以找到這個按鈕,但是就是定位不到,原因如下:
(1)有些DIV彈框裝載了很多元素,用的是慢載入方式,彈框中按各元素才會顯示,因為需要設定等待時間,等元素加載出來後,才能定位到

(2)DIV彈框失去了聚焦點,導致無法識別元素,可藉助actionChains, 移動滑鼠至DIV彈框元素上,進行聚焦,藉助

EC.visibility_of_all_elements_located,判斷元素可見後,再進行操作

action_chains = ActionChains(driver)
action_chains.move_to_element(driver.find_element(By.XPATH,"//div[@class='el-dialog__body']")).click().perform()
elementDialog = (By.XPATH,"//div[@class='el-dialog__body']")
wait_element(driver,elementDialog)
wait_element(driver,(By.CSS_SELECTOR,"div.el-form-item.is-success.is-required>div>div>input"))
driver.find_element_by_css_selector("div.el-form-item.is-success.is-required>div>div>input").click()
driver.find_element_by_css_selector("div.el-form-item.is-success.is-required>div>div>input").clear()
def wait_element(driver, *locator,):
    """等待元素在指定的時間內出現"""
wait=WebDriverWait(driver, 30, 1,(StaleElementReferenceException,))
try:
ele=wait.until(EC.visibility_of_all_elements_located(*locator))
return ele
except TimeoutException:
print("timeout exception,Can't find element by method : %s",*locator)
return False

(3)某些DIV彈框設定了style="display: none;" ,則這個框不可見,導致元素無法定位到

解決辦法:

js = "document.getElementsByClassName('el-dialog__wrapper')[0].style";
//執行js後得到的結果是List,所以將結果轉換為List
driver.executeScript(js);
//如果list.size()==1,就點選彈框的按鈕(根據實際情況寫)

或者直接將display改為block
js = "document.getElementsByClassName('el-dialog__wrapper')[0].style.display="block";
這樣能解決元素隱藏,定位不到的問題


新標籤頁彈窗

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

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

alert彈窗

alert、confirm、prompt彈出框的主要操作方法:

ext:獲取文字值

accept() :點選"確認"

dismiss() :點選"取消"或者關閉彈出框

send_keys() :輸入文字值


self.browser.find_element_by_id("alert").click()
alert=self.browser.switch_to_alert()
print(alert.text)
#點選確定按鈕
alert.accept()

confirm彈窗

self.browser.find_element_by_id("confirm").click()
confirm = self.browser.switch_to_alert()
print(confirm.text)
#點選確定按鈕
confirm.accept()
#點選取消按鈕
confirm.dismiss()

prompt彈窗

self.browser.find_element_by_id("prompt").click()
prompt = self.browser.switch_to_alert()
print(prompt.text)
prompt.accept()