(十三)警告框处理

虫师 创建于 1 年多 之前

最后更新时间 2018-11-03


在WebDriver中处理JavaScript所生成的alert、confirm以及prompt十分简单,具体做法是使用 switch_to.alert 方法定位到 alert/confirm/prompt,然后使用text/accept/dismiss/ send_keys等方法进行操作。

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

  • accept():接受现有警告框。

  • dismiss():解散现有警告框。

  • send_keys(keysToSend):发送文本至警告框。keysToSend:将文本发送至警告框。

如下图,百度搜索设置弹出的窗口是不能通过前端工具对其进行定位的,这个时候就可以通过switch_to_alert()方法接受这个弹窗。

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time

driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get('http://www.baidu.com')

# 鼠标悬停至“设置”链接
link = driver.find_element_by_link_text('设置')
ActionChains(driver).move_to_element(link).perform()

# 打开搜索设置
driver.find_element_by_link_text("搜索设置").click()

# 保存设置
driver.find_element_by_class_name("prefpanelgo").click()
time.sleep(2)

# 接受警告框
driver.switch_to.alert.accept()

driver.quit()

通过switch_to_alert()方法获取当前页面上的警告框,并使用accept()方法接受警告框。

我要留言

  • dr.find_element_by_link_text("搜索设置").click() dr.find_element_by_link_text("保存设置").click()

    这两句代码中间加入时间间隔,其它代码原封不动。time.sleep() ①组时间间隔为:1/1000,10/1000,50/1000,110/1000,115/1000。稳定报错: 【NoSuchElementException: Message: no such element: 】

    ②组时间间隔为:120/1000,130/1000,150/1000,180/1000,250/1000,300/1000。不定出现: 【NoAlertPresentException: Message: no such alert】、【NoSuchElementException: Message: no such element: 】、【弹窗成功】

    ③时间间隔为:大于400/1000,代码都能正常走完

    我们分析一下第①组数据,无论你说是model没消失或者页面没渲染看似都说得通,但是别忽略一点NoSuchElementException:源码中有一句:Element may not yet be on the screen at the time of the find operation, (webpage is still loading) , 译为:元素在查找操作时可能尚未出现在屏幕上。后面的我就不说了

    再看第②组数据,其中有个异常NoAlertPresentException:源码只有一句:This can be caused by calling an operation on the Alert() class when an alert is not yet on the screen.译为:这可能是由于在屏幕上尚未出现警告时调用Alert()类操作造成的。也就是说虽然这个时候“保存设置”的文字是渲染好了,但是它的alert功能尚未完全部署好

    对此。可能有的同学不太好理解,那么我就对这一行代码进行改造。

    dr.find_element_by_link_text("保存设置").click() -----将这行代码替换为下面这句

    dr.find_element_by_xpath("//td[.='设定您希望搜索结果显示的条数']").click()

    这个时候,稳定报错:【NoAlertPresentException: Message: no such alert】。为什么?因为点击一个不是警告功能的元素,还去调用alert()方法就会报这个错

    验证成功

    Orange 创建于 2019-12-25 18:22:24

  • 首先我们执行这样两句代码:print(time.time())------print(time.time())。理论上,两次点击事件的执行时间为“1577260399.704221;1577260399.704248”。而我们知道页面的渲染需要时间,即使不用加载新页面。

    我们再去看dr.find_element_by_link_text("搜索设置").click()和dr.find_element_by_link_text("保存设置").click(),这样解释报错原因可以说的过去:因为这时候我们要点的元素还没有渲染出来。前面有个哥们说:“上一个modal可能还没完全关闭掉”。为了验证这个说法,我又做了一组数据

    Orange 创建于 2019-12-25 17:43:20

  • driver.find_element_by_link_text('保存设置').click()

    这一行运行会出错,解决办法是在前面加一行代码:sleep(6) 然后运行就可以了,原因可能是 保存设置 是一个temporary layer,需要等待

    ella 创建于 2019-11-20 23:39:52

  • 我之前的报错: Message: element click intercepted: Element ... is not clickable at point (580, 170). Other element would receive the click: ... 我的解决方法,在 '搜索设置' 和 '保存设置' 之间加一段等待时间:

    保存设置

    driver.find_element_by_class_name('prefpanelgo').click() time.sleep(2)

    接受警告框

    driver.switch_to.alert.accept()

    mona2544 创建于 2019-10-19 11:41:45

  • @jayunq 解释的太好了,如果可以关注你就好了

    danike 创建于 2019-10-06 11:15:11

  • 不是aler这怎么处理: raise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoAlertPresentException: Message: no alert open (Session info: chrome=75.0.3770.80) (Driver info: chromedriver=2.37.544315 (730aa6a5fdba159ac9f4c1e8cbc59bf1b5ce12b7),platform=Windows NT 6.1.7601 SP1 x86_64)

    chase001 创建于 2019-07-19 09:23:35

  • 我的通了,可能会因为百度请求超时报错,百度真垃圾,代码如下: from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains import time driver = webdriver.Chrome() driver.implicitly_wait(10) driver.maximize_window() driver.implicitly_wait(10) driver.get('http://www.baidu.com') driver.implicitly_wait(10) link = driver.find_element_by_link_text('设置')# 定位鼠标要悬停的元素 driver.implicitly_wait(10) ActionChains(driver).move_to_element(link).perform()# 鼠标悬停至“设置”链接 driver.implicitly_wait(10) driver.find_element_by_link_text("搜索设置").click()# 打开搜索设置 time.sleep(6) driver.find_element_by_xpath('//*[@id="gxszButton"]/a[1]').click()# 保存设置 print("点击保存按钮") time.sleep(3) driver.switch_to.alert.accept()# 接受警告框 time.sleep(2) driver.quit()

    哈哈哈学习使我快乐 创建于 2019-07-17 14:17:51

  • driver.find_element_by_link_text("搜索设置").click() time.sleep(2) # Firefox上正常运行的脚本在chrome上提示Element is not clickable at point # 分析原因, # 首先肯定不是因为页面元素不存在而无法点击。也不是要点击的button不在预览范围内。 # 后来发现,是被前一步的操作的一个弹出层挡住了。因为前几步是弹出了一个modal, # 在关闭modal的时候webdriver就立刻执行下一步点击某个link,而modal可能还没完全关闭掉。 # 解决办法是等待那个弹出层完全关闭掉,link可以点击的时候再执行 #在两步之间加了个简单的time.sleep(2)命令解决了

    保存设置

    driver.find_element_by_link_text('保存设置').click()

    jayunq 创建于 2019-06-07 00:45:50

  • Message: unknown error: Element ... is not clickable at point (579, 202). Other element would receive the click: ...

    richjack888 创建于 2018-12-29 20:59:18

  • 保存设置那栏会报错

    richjack888 创建于 2018-12-29 20:59:12