有时候需要在多窗口切换,webdriver提供了switch_to_window()方法支持切换窗口;

from selenium import webdriver
import os,time
driver = webdriver.Chrome()
frist_url = "http://www.baidu.com"
driver.get(frist_url)
#获取百度登录窗口句柄
login_windows = driver.current_window_handle
driver.find_element_by_link_text(u"登录").click()
driver.find_element_by_id("jgwab").click()

# 获取当前已打开所有窗口的句柄
all_handles = driver.window_handles
for handles in all_handles:
    if handles == login_windows:
        driver.switch_to_window(handles) 
        driver.find_element_by_xpath("//*[@id='TANGRAM__PSP_2__closeBtn']").click()
        print("当前页面标题是:",driver.title)
    else:
        driver.switch_to_window(handles)
        print("新打开页面的标题是:", driver.title)

脚本的实现思路:

先获取到打开页面的窗口句柄,然后新打开一个页面;获取到所有窗口的句柄;在所有窗口句柄中循环,如果句柄=百度的窗口句柄,就是百度页面,操作百度页面元素;否则就是新打开的页面,输入页面标题;

这里我们用到了几种新的方法:

current_window_handle #获取当前页面的句柄    
window_handles             #获取所有窗口的句柄
switch_to_window           #切换窗口

2. 警告框处理

实际工作中我们会碰到弹窗提示的情况(alert、confirm、prompt),在webdriver中我们会使用switch_to_alert()方法定位,然后使用text/accept/dismiss/send_keys按需操作;

  • text 返回alert、confirm、prompt的文字信息;
  • accept 点击确认按钮;
  • dismiss 点击取消按钮;
  • send_keys 输入值(没有对话框就不要用了,会报错);
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import os,time
driver = webdriver.Chrome()
frist_url = "http://www.baidu.com"
driver.get(frist_url)

link = driver.find_element_by_link_text(u"设置")
#设置鼠标悬停
ActionChains(driver).move_to_element(link).perform()
#打开搜索设置
driver.find_element_by_class_name("setpref").click()
time.sleep(2)
#点击保存设置按钮
driver.find_element_by_xpath('//*[@]/a[1]').click()
time.sleep(2)
#关闭弹框
driver.switch_to_alert().accept()

3. 上传文件

web页面的上传一般有以下几种方式:

普通上传:

普通的附件上传都是将本地文件的路径作为一个值放到input标签中,通过form表单提交的时候将将这个值提交给服务器。

插件上传:

一般指基于Flash与javascript或Ajax等技术实现的上传功能或插件。

3.1 send_keys上传

通过input标签实现的上传,可以将其看成是一个输入框,通过send_keys传入本地文件路径从而模拟上传功能;

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div class="row_filuid">
        <div class="span6 well">
            <h3>upload_file</h3>
            <input type="file" name="file"/>
        </div>
    </div>
</body>
</html>
upfile.html

相关文章: