在爬取网页的过程中,经常会遇到一些d窗的情况,有alert、confirm、prompt等三种,区别如下:
提示消息框 提供了一个文本字段,用户可以在此字段输入一个答案来响应您的提示。该消息框有一个“确定”按钮和一个“取消”按钮。如果您提供了一个辅助字符串参数,则提示消息框将在文本字段显示该辅助字符串作为默认响应。否则,默认文本为 "<undefined>"。
这三种d窗的共同点是,d出之后你是获取不到任何网页内容的,也就是无法通过常规的driverfind_element_by_xpath这种形式来获取元素。F12是没有任何内容,也无法点选的。
selenium另外有一套方法来把driver转换到d窗上:
其中driver就是你设置好的浏览器句柄,switch_toalert代表你当前的d窗类型,alert就对应alert,accept的意思就是点确定,另外还有dismiss等用法,网上很多了,不详细说。
用这个语句,就可以把d窗点掉,之后正常 *** 作,但是我重点想说的是以下内容:
在实际网页中,往往d窗会有一定延时,这时候你用这个语句就会报一个no such alert的错误,意味着获取不到d窗,此时要用如下的办法解决:
引用Webdriver类,里面的参数第一个是句柄,第二个则是超时等待时间,这里是10秒钟。
Webdriver这种方法叫做 显示等待 ,用一个默认频率不停的刷新(默认是05s),检测当前页面元素是否存在,如果超过10秒则抛出TimeOut。
很显然,这种方法比一般的sleep效率要高。
waituntil(ECalert_is_present())就是判断d窗是否存在,如果存在,那么就不会抛出异常,继续走下一步也就是获取到d窗点击确定。
之后就可以进行正常的 *** 作了。
无法打印出元素的值(用户名密码错误)
原因是:style="display: none;" 元素不展示
修改 style的值
修改后:style=display: block;
然后就可以打印出值(用户名或密码错误)
总结:
你可以用 CSS 选择器,然后根据其属性获取。
我把你这段拷贝下来放到完整 html 规范的 body 中:
在这里 CSS 选择器能通过指定第几个孩子来选择元素 body > div:nth-child(2) > p。
import osfrom selenium import webdriver
from seleniumwebdriverchromeoptions import Options
chromeOptions = Options()
brower = webdriverChrome(chrome_options = chromeOptions, executable_path = osenviron['PROGRAMFILES(X86)'] + r'\Google\Chrome\Application\chromedriverexe')
browerset_window_rect(x = 0, y = 0, width = 1920, height = 1080)
url = r'file:///C:/Users/admin/Desktop/tmp/tmphtml'
browerget(url)
element = browerfind_element_by_css_selector('body > div:nth-child(2) > input')
elementget_property('placeholder')
Out[2]: '6-16位密码,区分大小写,不能用空格'
以上就是关于Selenium-针对alertd窗无法获取,d出no such alert的解决方法全部的内容,包括:Selenium-针对alertd窗无法获取,d出no such alert的解决方法、python selenium 无法获取元素的值、selenium获取元素问题(className相同)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)