selenium定位弹框元素

selenium定位弹窗元素

一、 弹出框是alert类型:

selenium提供switch_to_alert方法:捕获弹出对话框(可以定位alert、confirm、prompt对话框)

alert=switch_to_alert;

      altert.text 查看alter的文案

     确认altert:

    altert.accept()

    取消altert:

    altert.dismiss()

   向altert对话框中输入文字:

   altert.send_keys()

二、弹出框不是alert类型:

1、弹出框是div层,跟平常一样定位,最好设置一下等待时间

#点击退出按钮

FindElement(self.brower,"classname","btn-exit").click()

#time.sleep(3)

#点击确认按钮(直接定位元素不用管页面的弹出样式,driver.window_handles打印出来的窗口在同一个页面)

FindElement(self.brower, "classname", "pro-btn.btn-2.btn-confirm").click()

 像这种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";
这样能解决元素隐藏,定位不到的问题

 

2、弹出框是iframe

driver.switch_to.frame("frame1")之后进行定位元素

注意:此处需要注意iframe定位时元素需要为固定的,不能随机变化之前出现过iframe用xpath定位,但xpath中的元素是动态变化的。此时可以定位父级元素,然后再定位下级。

 

3、新标签页弹窗,则需要进行窗口的切换。

此处第一个窗口打开淘宝首页,在打开一个新窗口打开支付宝首页,在两个窗口之间进行切换。       切换到不同的窗口之后,就可以用常规的方法进行元素的定位弹出内容是嵌入的窗口解决思路:

# 打印所有的handle

all_handles = driver.window_handles print(all_handles)

# 切换到新的handle上

driver.switch_to.window(all_handles[1])

 
————————————————
版权声明:本文为CSDN博主「小炮灰冲鸭」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ningmengbu_suan/article/details/107342844

  • 8
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值