1. 多窗口切换

有时候需要在多窗口切换,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('//*[@id="gxszButton"]/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

from selenium import webdriver
import os,time
driver = webdriver.Chrome()
#打开上传页面
file_path = "file:///" + os.path.abspath('upfile.html')
driver.get(file_path)
#定位上传按钮,添加本地文件
driver.find_element_by_name("file").send_keys("E:\\Jira的安装及配置.docx")
driver.quit()

3.2 Autoit上传

Autoit用于windowsGUI进行自动化操作。它利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动化任务。

官方地址:https://www.autoitscript.com/site/

安装后我们可以看到以下文件:

  • Autoit windows info 帮助我们识别windows控件信息;
  • Compile Script to.exe 用于将Autoit生成exe执行文件;
  • Run script 用于执行Autoit脚本;
  • SciTE Script Editor 用于编写Autoit脚本;

1)访问upfile.html页面,点击选择文件,显示上传弹窗;

2)打开Autoit windows info(可选择x64 x86);

3)将finder Tool拖到文件名下拉框获取文件名控件信息:

4)识别打开按钮控件信息:

5)通过上面两个步骤我们可以获取到以下信息:

页面标题:打开;

页面class:#32770

文件名输入框的class是:"Edit",Instance是1,classnameNN是"Edit1";

打开按钮的class是:Button,instance是1,classnameNN是"Button1";

6)SciTE Script Editor编写脚本:

ControlFocus("打开","","Edit1")

WinWait("[CLASS:#32770]","",10)

ControlSetText("打开","","Edit1","E:\\Jira的安装及配置.docx")
Sleep(2000)
ControlClick("打开","","Button1");

7)校验脚本是否成功:

打开upfile.html页面,点击选择文件按钮显示选择文件弹出框,F5运行刚编写的文件-------可以正常将文件名字放到文件名选择框中;

8)将脚本保存,命名为upfile.au3;

9)打开Compile Script to.exe,选择刚保存的脚本文件转换成exe文件;

10)自动化脚本调用upfile.exe文件;

from selenium import webdriver
import os,time
driver = webdriver.Chrome()
#打开上传页面
file_path = "file:///" + os.path.abspath('upfile.html')
driver.get(file_path)
#点击打开上传窗口
driver.find_element_by_name("file").click()
#调用upfile.exe上传程序
os.system("E:\\upfile.exe")
driver.quit()

4. 下载文件

4.1 firefox文件下载

对于Firefox,需要我们设置其Profile:

  • browser.download.dir:指定下载路径;

  • browser.download.folderList:设置成 2 表示使用自定义下载路径;设置成 0 表示下载到桌面;设置成 1 表示下载到默认路径;

  • browser.download.manager.showWhenStarting:在开始下载时是否显示下载管理器;

  • browser.helperApps.neverAsk.saveToDisk:对所给出文件类型不再弹出框进行询问;

下面来个示例:

from selenium import webdriver
from time import sleep profile = webdriver.FirefoxProfile()
profile.set_preference('browser.download.dir', 'D:\\')
profile.set_preference('browser.download.folderList', 2)
profile.set_preference('browser.download.manager.showWhenStarting', False)
profile.set_preference('browser.helperApps.neverAsk.saveToDisk', 'application/zip') driver = webdriver.Firefox(firefox_profile=profile) driver.get('http://sahitest.com/demo/saveAs.htm')
driver.find_element_by_xpath('//a[text()="testsaveas.zip"]').click()
sleep(3)
driver.quit()

Firefox需要针对每种文件类型进行设置,这里需要我们查询对应文件的MIME类型,可以用以下链接进行查询:MIME 参考手册

4.2 chrome文件下载

Chrome浏览器类似,设置其options:

  • download.default_directory:设置下载路径

  • profile.default_content_settings.popups:设置为 0 禁止弹出窗口

它的设置就简单多了,看个示例:

from selenium import webdriver
from time import sleep options = webdriver.ChromeOptions()
prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory': 'D:\\'}
options.add_experimental_option('prefs', prefs) driver = webdriver.Chrome(executable_path='C:\\Users\\jhon\\AppData\\Local\\Programs\\Python\\Python35-32\\chromedriver.exe', chrome_options=options)
driver.get('http://sahitest.com/demo/saveAs.htm')
driver.find_element_by_xpath('//a[text()="testsaveas.zip"]').click()
sleep(3)
driver.quit()

5. 操作cookie

webdriver操作cookie的方法有:

  • get_cookies()                 获得所有cookie信息

  • get_cookie(name)          返回有特定name值有cookie信息

  • add_cookie(cookie_dict) 添加cookie,必须有name和value值

  • delete_cookie(name)      删除特定(部分)的cookie信息

  • delete_all_cookies()        删除所有cookie信息

获取cookie:

from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
cookie = driver.get_cookies()
print(cookie)
driver.quit()

添加cookie:

from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
cookie = driver.add_cookie({"name":"ddddd","value":"value_dddddd"})
for cookie in driver.get_cookies():
print("%s-%s"%(cookie['name'],cookie['value']))
driver.quit()

6. 调用javascript

WebDriver 提供了 execute_script()方法来执行 JavaScript 代码。

from selenium import webdriver
import time
driver = webdriver.Chrome()
#访问百度
driver.get("http://www.baidu.com")
#搜索
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
time.sleep(3)
#将页面滚动条拖到底部
js = "var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
time.sleep(3)
#将页面滚动条移动到顶部
js_= "var q=document.documentElement.scrollTop=0"
driver.execute_script(js_)
time.sleep(3)
driver.quit()

7. 窗口截图&关闭窗口

7.1 窗口截图

自动化脚本是交给工具去执行,有时候打印的错误信息并不十分明确,如果在脚本执行出错的时候将对当前窗口截图保存,那么通过图片信息会更只观帮助我们找到脚本出错的原因。Webdriver 提供了截图函数 get_screenshot_as_file()来截取当前窗口。

在本例中用到了 Python 的异常处理,要本例中百度输入框的 id=kw_error 会定位不到元素,那么 try就会捕捉到这个异常,从而执行 except,在 except 中执行 get_screenshot_as_file()对当前窗口进行截图,这里需要指定图片的保存路径及文件名,并且关闭当前驱动;

from selenium import webdriver
import time
driver = webdriver.Chrome()
#访问百度
driver.get("http://www.baidu.com")
try:
driver.find_element_by_id('kw_error').send_keys("selenium")
driver.find_element_by_id("su").click()
except:
driver.get_screenshot_as_file("D:\\python脚本\\baidu_error.jpg")
driver.quit()

7.2 关闭窗口

在前页的例子中我们一直在使用 quit()方法,其含义为退出相关的驱动程序和关闭所有窗口。除此之外 WebDriver 还提供了 close()方法,用于关闭当前窗口。当脚本在执行时打开了多个窗口,我们只能关闭其中一个时,就可以使用close()方法;

ui自动化之selenium操作(五)简单元素操作--续的更多相关文章

  1. Selenium 2自动化测试实战9(简单元素操作)

    一.简单元素操作 1. webdriver中常用的几个方法: clear():清除文本 send_keys(*value):模拟按键输入 click():单击元素 clear()方法用于清除文本输入框 ...

  2. selenium--控制浏览器和简单元素操作

    控制浏览器1.driver.maximize_window() #浏览器最大化2.driver.set_windows_size(480*800) #浏览器设置成移动端大小(480*800),参数数字 ...

  3. webdriervAPI(控制浏览器及简单元素操作)

    from  selenium  import  webdriver driver  =  webdriver.Chorme() driver.get("http://www.baidu.co ...

  4. UI自动化和selenium相关以及八大定位

    一.UI自动化相关 1. UI自动化的本质(重点) 定位元素→操作元素→模拟页面操作→断言→测试报告 2. 适合UI自动化的场景 UI自动化的前提条件 (1)需求不能频繁变动 (2)UI稳定(UI自动 ...

  5. D3.js系列——元素操作和简单画布操作

    一.元素操作: 1.选择元素 select 和 selectAll,以及选择集的概念 var p = d3.select("body").select("p") ...

  6. ui自动化之selenium操作(四)简单元素操作

    1. clear() clear()方法用于清除文本输入框内的内容:一般输入框中都有默认文字,如果不清空有可能会导致字符拼接: browser.find_element(By.ID,"use ...

  7. ui自动化之selenium操作(二)定位元素-简单操作

    1. 将浏览器最大化 这里拿chrome举例,但是我在执行的时候一直报错,被坑了好久; 解决办法: 这是因为chromedriver是和chrome一一对应的,不兼容的版本就会报错: 所有chrome ...

  8. selenium UI自动化解决验证码的五种方法

    TesseractPy3.py #coding=utf-8 import os import subprocess import traceback import logging from PIL i ...

  9. ui自动化之selenium操作(三)xpath定位

    xpath 的定位方法,非常强大.使用这种方法几乎可以定位到页面上的任意元素. 1. 什么是xpath? xpath 是XML Path的简称, 由于HTML文档本身就是一个标准的XML页面,所以我们 ...

随机推荐

  1. tomcat服务器经常需要重启

    程序看着运行正常,但是点击几下就没反应了. 可能原因:1.tomcat内存不足 2.程序中有资源未释放.比如session(hibernate的)等(需要close)

  2. CompletableFuture引入

    一.Future介绍 Future以前我们如果有个方法action执行,比如去数据库中查询数据.上传一个文件等,这个方法执行10分钟,调用者就需要等10分钟.基于此,调用者可以先执行action,返回 ...

  3. 修改ubuntu终端显示目录和计算机名称(转)

    注意:使用方法:# PS1='自定义内容' 注意两边的单引号 示例: PS1='(\u@\H \d \t)\$' ------------------------------------------- ...

  4. Elasticsearch 6.2.3版本 Windows环境 简单操作

    背景描述 Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎.无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进.性能最好的.功能最全的搜索引擎库. El ...

  5. Django模型的Field Types

    Field Types 常用参数: null 如果设置为 True , Django 存放一个 NULL 到数据库字段.默认为 False. allow_null 如果设置为 True , 该字段将接 ...

  6. FileSystemWatcher监听文件事件

    现有一个需求如下:监控某个目录中的文件修改,创建,删除等信息,并记录下来. 这里用到FileSystemWatcher类.由于考虑到文件的写入量会很频率,所以考虑先将监听到的消息记录到内存中. 监听部 ...

  7. centos7.5 升级kernel内核版本

    一,查看当前系统内核版本信息 awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg 或 ...

  8. CentOS7中SSH免密登陆设置

    一.准备三台客户机 hadoop100 192.168.13.100(Master) hadoop101 192.168.13.101 hadoop102 192.168.13.102 二.在hado ...

  9. 【深度聚类】Superpixel Sampling Networks

    Superpixel Sampling Networks 原始文档:https://www.yuque.com/lart/papers/ssn 本文的思想很简单,传统的超像素算法是一种有效的低/中级的 ...

  10. pycharm中ctrl + C复制, ctrl+A全选等快捷键失效

    原因是:在安装pycharm的时候也同时安装了vim插件,需要在settings  - > vim Emulation里将相关的handler改成 IDE