4.handle句柄操作,iframe窗口切换

我们在浏览窗口的时候,经常会遇到点击一个新的链接,就是会出来一个新的窗口
那在切换到新的窗口的时候页面的句柄也会发生变化,句柄类似就是页面的id,页面发生变化之后,句柄也会发生变化,
**这个时候我们再进行元素定位的时候是定位不到新窗口的元素的,**因为新窗口的句柄已经发生变化,所以我们需要将句柄切换到新的窗口,才能进行元素的定位。

handle句柄操作

运行以下代码测试一下:

from selenium import webdriver
wd = webdriver.Chrome()
wd.implicitly_wait(10)
wd.get('http://cdn1.python3.vip/files/selenium/sample3.html')
# 点击打开新窗口的链接
link = wd.find_element_by_tag_name("a")
link.click()
# wd.title属性是当前窗口的标题栏 文本
print(wd.title)

运行完之后可以发现打开的title标题依然是旧窗口的标题,所以在切换到新窗口的时候我们需要将句柄也切换过去
通过下面的代码可以切换到新的窗口
switch_to.window(handle)

for handle in wd.window_handles:
    # 先切换到该窗口
    wd.switch_to.window(handle)
    # 得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口
    if 'Bing' in wd.title:
        # 如果是,那么这时候WebDriver对象就是对应的该该窗口,正好,跳出循环,
        break

下面以百度新闻为例

from selenium import webdriver
import time
driver=webdriver.Chrome()

driver.get("http://news.baidu.com/")
#切换到新的页面
driver.find_element_by_xpath("//*[@id='pane-news']/div/ul/li[1]/strong/a").click()

hand=driver.window_handles  #获取所有的句柄,句柄包含两个句柄在里面
driver.close()  #关掉原来的页面
#打开最后一个句柄
driver.switch_to.window(hand[len(hand)-1])
print(driver.title)

可以通过current_window_handle获取当前窗口的句柄,如果后面还想回到原来的界面的话就可以回到原来的句柄

#mainWindow变量保存当前窗口的句柄
mainWindow = wd.current_window_handle
#通过前面保存的老窗口的句柄,自己切换到老窗口
wd.switch_to.window(mainWindow)

这里写目录标题

    • handle句柄操作
  • frame窗口切换

frame窗口切换

在浏览页面的时候可能有些页面的登陆或者是其他的窗口是一个嵌入的iframe窗口,这个时候如果需要定位到iframe窗口上面的元素,我们需要换到iframe窗口,不然定位会失败

4.handle句柄操作,iframe窗口切换_第1张图片

在上面的页面中,如果需要定位到土豆的话需要切换到iframe窗口
switch_to.frame(frame_reference)

其中, frame_reference 可以是 frame 元素的属性 name 或者 ID 。

也可以填写frame 所对应的 WebElement 对象。
我们可以根据frame的元素位置或者属性特性,使用find系列的方法,选择到该元素,得到对应的WebElement对象

比如,这里就可以写
wd.switch_to.frame(wd.find_element_by_tag_name(“iframe”))
然后,就可以进行后续操作frame里面的元素了。

上面例子正确代码

from selenium import webdriver
wd = webdriver.Chrome(r'd:\webdrivers\chromedriver.exe')
wd.get('http://cdn1.python3.vip/files/selenium/sample2.html')
# 先根据name属性值 'innerFrame',切换到iframe中
wd.switch_to.frame('innerFrame')
# 根据 class name 选择元素,返回的是 一个列表
elements = wd.find_elements_by_class_name('plant')
for element in elements:
    print(element.text)

你可能感兴趣的:(selenium,定位,python,软件测试)