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. 拉普拉斯矩阵(Laplacian matrix)

    原文地址:https://www.jianshu.com/p/f864bac6cb7a 拉普拉斯矩阵是图论中用到的一种重要矩阵,给定一个有n个顶点的图 G=(V,E),其拉普拉斯矩阵被定义为 L = ...

  2. DVM 和 JVM 的区别?

    a) dvm 执行的是.dex 文件,而 jvm 执行的是.class.Android 工程编译后的所有.class 字节码会被 dex 工具抽取到一个.dex 文件中.b) dvm 是基于寄存器的虚 ...

  3. Tensorflow所遇坑

    TensorFlow问题: 1.FLAGS._parse_flags()报错AttributeError:_parse_flags 解决: 因为TensorFlow的版本问题了,TensorFlow版 ...

  4. Python_元组、字典内建方法详解

    目录 目录 前言 软件环境 元组Tuple count 查询一个元素在Tuple中的数量 index 查询元素在Tuple中的索引号 元组的遍历 字典Dictionary 创建一个字典对象 简单的创建 ...

  5. Windows 10 无法访问共享的解决办法大全

    本文前面介绍 Windows 10 操作系统无法访问其他电脑的共享文件夹,而其他电脑访问该共享可以访问的解决办法. 简单点说就是,你的操作系统是 Win10 ,你访问不了某台电脑的共享,但是别人可以. ...

  6. 手写BP(反向传播)算法

    BP算法为深度学习中参数更新的重要角色,一般基于loss对参数的偏导进行更新. 一些根据均方误差,每层默认激活函数sigmoid(不同激活函数,则更新公式不一样) 假设网络如图所示: 则更新公式为: ...

  7. 解决ubuntu16.04 USB鼠标键盘使用卡顿

    小米游戏本,键盘突然M建不能用,去了售后换了个键盘. 小米售后真的不想吐槽……入坑 键盘鼠标卡顿由于挂起导致失灵,每次需要激活所以卡顿 解决办法如下: 编辑如下文件配置 sudo vim /etc/l ...

  8. composer配合github发布管理代码包

    前言 今日使用composer结合github管理代码包过程,方便日后需要,特此记录 流程 1 最大同性交友网站github创建自己项目,在自己项目新增composer.json文件 2 compos ...

  9. C#后台正则表达式

    static Regex RegPhone = new Regex(@"^((1[34578][0-9]{1}))\d{8}");        static Regex RegN ...

  10. 【转】mysql的group_concat函数,默认最大长度是1024

    mysql的group_concat函数,默认最大长度是1024 查询sql: show variables like 'group_concat_max_len'; 设置方式: 修改配置文件my.i ...