selenium笔记:窗口切换时的元素定位

主要参考虫师的博客,他的文章里面讲得比较简单,有一些情况没有考虑到,在这里做个笔记。

在虫师的博客中讲了如何在一个给定的网页去定位元素,但是如果在实际操作中,需要由一个页面跳转到另一个页面时,就需要页面之间的切换了。

1. switch_to_window()

  这个方法在虫师的博客中讲得不是很详细,我主要参考的是 http://blog.csdn.net/hhabc123456789/article/details/21862139

  直接上一个我用来测试的例子吧。 

#coding=utf-8

import os
from selenium import webdriver
import time


chrome = 'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe'
os.environ["webdriver.chrome.driver"] = chrome
driver = webdriver.Chrome(chrome)

driver.get('http://www.baidu.com')

#获取当前窗口的句柄
currentWin = driver.current_window_handle

#跳转到另一个新页面
driver.find_element_by_xpath("//p[@id='nv']/a[3]").click()
time.sleep(1)
#获取所有窗口的句柄
handles = driver.window_handles
for i in handles:
    if currentWin == i:
        continue
    else:
        #将driver与新的页面绑定起来
        driver = driver.switch_to_window(i)
#在新的页面定位元素
driver.find_element_by_xpath("//div[@id='menu']/a[1]").click()
time.sleep(2)
driver.quit()    

  应该比较清晰了,注释里面都解释了。

  补充一下:我本来以为只要网页的url改变了,driver就需要更新。后来发现driver真的是对应到一个特定的窗口的。不论url如何更新,只要没有新的“标签页”出现(html的实现上就是target="_blank"这种形式的),driver就不用更新,也就用不到这里的switch_to_window()的方法了。

2. switch_to_frame()

  这个方法虫师将得比较清楚,可以参考这里的例子,只是有一个问题需要注意。如下代码

#coding=utf-8
from selenium import webdriver
import time
import os

browser = webdriver.Firefox()
file_path =  'file:///' + os.path.abspath('frame.html')
browser.get(file_path)

browser.implicitly_wait(30)
#先找到到ifrome1(id = f1)
##############一定要先定位frame1,才能找得到fram2###############################
browser.switch_to_frame("f1")
#再找到其下面的ifrome2(id =f2)
browser.switch_to_frame("f2")


#下面就可以正常的操作元素了
browser.find_element_by_id("kw").send_keys("selenium")
browser.find_element_by_id("su").click()
time.sleep(3)

browser.quit()

  如注释里面说明的,如果frame有嵌套的话,必须一层一层的找。否则会报错。

  如上

Bon Appetite!

原文地址:https://www.cnblogs.com/zhawj159753/p/3835585.html