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()

 

 

 

 

posted @ 2021-12-23 15:56  xiaowangzi3668  阅读(4875)  评论(1编辑  收藏  举报