浏览器抓取网页( Selenium处理多窗口场景多个窗口识别与切换(图))
优采云 发布时间: 2021-10-27 22:09浏览器抓取网页(
Selenium处理多窗口场景多个窗口识别与切换(图))
网页框架及多窗口、多浏览器、上传弹窗处理
Selenium 处理多窗口场景下的多窗口识别和切换
单击某些链接将重新打开一个窗口。在这种情况下,如果要在新页面上进行操作,则必须先切换窗口。获取的窗口的唯一标识由一个句柄表示,因此您只需切换句柄即可在多个页面之间灵活操作。
处理流程:
1.先获取当前窗口的句柄
driver.current_window_handle
2.再次获取所有窗口句柄
driver.window_handles
3. 判断是否是你要操作的窗口,如果是,可以对该窗口进行操作,如果不是,则跳转到另一个窗口,对另一个窗口进行操作
driver.switch_to_window
Selenium处理帧多帧识别与切换
做web自动化的时候,如果找不到某个元素,可能是因为该元素在iframe中
框架是 HTML 中的框架。HTML中所谓的frame,是指在同一个浏览器中可以显示多个页面
基于HTML的框架可以分为垂直框架和水平框架(cols,rows)
车架分类
frame标签收录三种类型:frameset、frame、iframe
框架集和普通标签一样,不会影响正常定位。您可以使用任何 index、id、name、webelement 方法来定位框架
Frame 和 iframe 对于 selenium 定位是相同的。Selenium 有一组方法来操作框架:
driver.switch_to.frame() # 根据元素id或者index切换frame
driver.switch_to.default_content() # 切换到默认frame
driver.switch_to.parent_frame() # 切换到父级frame
未嵌套的 iframe
driver.switch_to_frame("frame的id")
driver.switch_to_frame("frame-index") # frame无id的时候可以根据索引来处理,索引从0开始,如:driver.switch_to_frame(0)
嵌套 iframe
这时候先进入iframe的父节点,再进入子节点,然后进行操作
driver.switch_to.frame("父节点")
driver.switch_to.frame("子节点")
多浏览器处理
通过传递不同的参数来处理不同的浏览器,比如将浏览器类型作为参数传递给os.getenv方法,然后根据传递的参数判断选择不同的浏览器
def setup(self):
browser = os.getenv("browser")
if browser == 'firefox':
self.driver = webdriver.Firefox()
elif browser == 'chrome'
self.driver = webdriver.Chrome()
文件上传处理输入标签
可以直接使用send_keys(文件地址)上传文件:
el = driver.find_element_by_id("上传按钮id")
el.send_keys("文件路径+文件名")
*敏*感*词*处理机制
在页面上操作时,会遇到一些由JavaScript生成的alert、confirm、提示弹窗。这时候可以使用switch_to.alert()方法来定位。然后使用text/accept/dismiss/send_keys等方法进行操作。
switch_to.alert() # 获取当前页面上的警告框
text() # 返回alert/confirm/prompt中的文字信息
accept() # 接受现有警告框
dissmiss() # 解散现有警告框
send_keys(keysToSend) # 发送文本至警告框,keysToSend:将文本发送至警告框
最简单粗暴的判断弹窗是 JavaScript 生成的警报还是 div 组件的方法:无法在浏览器的开发者工具中定位警报