webdriver高级应用- 操作富文本框
富文本框的技术实现和普通的文本框的定位存在较大的区别,富文本框的常见技术用到了Frame标签,并且在Frame里面实现了一个完整的HTML网页结构,所以使用普通的定位模式将无法直接定位到富文本框对象。
方法一:调用WebDriver的send_key()方法实现
#encoding=utf-8
from selenium import webdriver
import unittest, time, traceback
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException, NoSuchElementException
from selenium.webdriver.common.by import By class TestDemo(unittest.TestCase): def setUp(self):
# 启动Firefox浏览器
#self.driver = webdriver.Ie(executable_path = "e:\\IEDriverServer")
self.driver = webdriver.Firefox(executable_path="e:\\geckodriver") def test_SohuMailSendEMail(self):
url = "http://mail.sohu.com"
# 访问搜狐邮箱登录页
self.driver.get(url)
try:
userName = self.driver.find_element_by_xpath\
(u'//input[@placeholder="请输入您的邮箱"]')
userName.clear()
userName.send_keys("fosterwu")
passWord = self.driver.find_element_by_xpath\
(u'//input[@placeholder="请输入您的密码"]')
passWord.clear()
passWord.send_keys("1111")
login = self.driver.find_element_by_xpath(u'//input[@value="登 录"]')
login.click()
wait = WebDriverWait(self.driver, 10)
# 显示等待,确定页面是否成功登录并跳转到登录成功后的首页
wait.until(EC.element_to_be_clickable\
((By.XPATH, '//li[text()="写邮件"]')))
self.driver.find_element_by_xpath(u'//li[text()="写邮件"]').click()
time.sleep(2)
receiver = self.driver.find_element_by_xpath\
('//div[@arr="mail.to_render"]//input')
# 输入收件人
receiver.send_keys("fosterwu@sohu.com")
subject = self.driver.find_element_by_xpath\
('//input[@ng-model="mail.subject"]')
# 输入邮件标题
subject.send_keys(u"一封测试邮件!")
# 获取邮件正文编辑区域的iframe页面元素对象
iframe = self.driver.find_element_by_xpath\
('//iframe[contains(@id, "ueditor")]')
# 通过switch_to.frame()方法切换进入富文本框中
self.driver.switch_to.frame(iframe)
# 获取富文本框中编辑页面元素对象
editBox = self.driver.find_element_by_xpath("/html/body")
# 输入邮件正文
editBox.send_keys(u"邮件的正文内容")
# 从富文本框中切换出,回到默认页面
self.driver.switch_to.default_content()
# 找到页面上的“发送”按钮,并单击它
self.driver.find_element_by_xpath('//span[.="发送"]').click()
# 显示都等待含有关键字串“发送成功”的页面元素出现在页面中
wait.until(EC.visibility_of_element_located\
((By.XPATH, '//span[.="发送成功"]')))
print u"邮件发送成功"
except TimeoutException:
print u"显示等待页面元素超时"
except NoSuchElementException:
print u"寻找的页面元素不存在", traceback.print_exc()
except Exception:
# 打印其他异常堆栈信息
print traceback.print_exc() def tearDown(self):
# 退出IE浏览器
self.driver.quit() if __name__ == '__main__':
unittest.main()
优点:实现简单,只要调用WebDriver对页面元素对象提供的send_keys()方法,即可实现内容输入
缺点:必须能定位到要被操作的元素,对脚本编写人员的定位能力要求比较高,同时不支持HTML格式的内容输入
方法二:
#encoding=utf-8
from selenium import webdriver
import unittest, time, traceback
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException, NoSuchElementException
from selenium.webdriver.common.by import By class TestDemo(unittest.TestCase): def setUp(self):
# 启动Firefox浏览器
#self.driver = webdriver.Firefox(executable_path="c:\\geckodriver")
self.driver = webdriver.Ie(executable_path = "e:\\IEDriverServer")
def test_SohuMailSendEMail(self):
url = "http://mail.sohu.com"
# 访问搜狐邮箱登录页
self.driver.get(url)
try:
userName = self.driver.find_element_by_xpath\
('//input[@placeholder="请输入您的邮箱"]')
userName.clear()
userName.send_keys("fosterwu")
passWord = self.driver.find_element_by_xpath\
('//input[@placeholder="请输入您的密码"]')
passWord.clear()
passWord.send_keys("")
login = self.driver.find_element_by_xpath('//input[@value="登 录"]')
login.click()
wait = WebDriverWait(self.driver, 10)
# 显示等待,确定页面是否成功登录并跳转到登录成功后的首页
wait.until(EC.element_to_be_clickable\
((By.XPATH, '//li[text()="写邮件"]')))
self.driver.find_element_by_xpath('//li[text()="写邮件"]').click()
time.sleep(2)
receiver = self.driver.find_element_by_xpath\
('//div[@arr="mail.to_render"]//input')
# 输入收件人
receiver.send_keys("fosterwu@sohu.com")
subject = self.driver.find_element_by_xpath\
('//input[@ng-model="mail.subject"]')
# 输入邮件标题
subject.send_keys(u"一封测试邮件!")
# 获取邮件正文编辑区域的iframe页面元素对象
iframe = self.driver.find_element_by_xpath\
('//iframe[contains(@id, "ueditor")]')
# 通过switch_to.frame()方法切换进入富文本框中
self.driver.switch_to.frame(iframe)
# 通过JavaScript代码向邮件正文编辑框中输入正文
self.driver.execute_script("document.getElementsByTagName('body')\
[0].innerHTML='<b>邮件的正文内容<b>;'")
# 从富文本框中切换出,回到默认页面
self.driver.switch_to.default_content()
# 找到页面上的“发送”按钮,并单击它
self.driver.find_element_by_xpath('//span[.="发送"]').click()
# 显示都等待含有关键字串“发送成功”的页面元素出现在页面中
wait.until(EC.visibility_of_element_located\
((By.XPATH, '//span[.="发送成功"]')))
print u"邮件发送成功"
except TimeoutException:
print u"显示等待页面元素超时"
except NoSuchElementException:
print u"寻找的页面元素不存在", traceback.print_exc()
except Exception:
# 打印其他异常堆栈信息
print traceback.print_exc() def tearDown(self):
# 退出IE浏览器
self.driver.quit() if __name__ == '__main__':
unittest.main()
优点:可以支持HTML格式的文字内容作为富文本框的输入内容
缺点:由于各种网页中富文本框实现的机制可能不同,有可能造成定位到富文本框的文本编辑区对象比较困难,此时就需要熟练了解HTML代码含义以及Frame的进出方式,对脚本编写人员的能力要求比较高
方法三:
#encoding=utf-8
from selenium import webdriver
import unittest, time, traceback
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException, NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import win32clipboard as w
import win32api, win32con # 用于设置剪切板内容
def setText(aString):
w.OpenClipboard()
w.EmptyClipboard()
w.SetClipboardData(win32con.CF_UNICODETEXT, aString)
w.CloseClipboard() # 键盘按键映射字典
VK_CODE = {'ctrl':0x11, 'v':0x56} # 键盘键按下
def keyDown(keyName):
win32api.keybd_event(VK_CODE[keyName], 0, 0, 0)
# 键盘键抬起
def keyUp(keyName):
win32api.keybd_event(VK_CODE[keyName], 0, win32con.KEYEVENTF_KEYUP, 0) class TestDemo(unittest.TestCase): def setUp(self):
# 启动Firefox浏览器
self.driver = webdriver.Firefox(executable_path="e:\\geckodriver") def test_SohuMailSendEMail(self):
url = "http://mail.sohu.com"
# 访问搜狐邮箱登录页
self.driver.get(url)
try:
userName = self.driver.find_element_by_xpath\
('//input[@placeholder="请输入您的邮箱"]')
userName.clear()
userName.send_keys("fosterwu")
passWord = self.driver.find_element_by_xpath\
('//input[@placeholder="请输入您的密码"]')
passWord.clear()
passWord.send_keys("")
login = self.driver.find_element_by_xpath('//input[@value="登 录"]')
login.click()
wait = WebDriverWait(self.driver, 10)
# 显示等待,确定页面是否成功登录并跳转到登录成功后的首页
wait.until(EC.element_to_be_clickable\
((By.XPATH, '//li[text()="写邮件"]')))
self.driver.find_element_by_xpath('//li[text()="写邮件"]').click()
time.sleep(2)
receiver = self.driver.find_element_by_xpath\
('//div[@arr="mail.to_render"]//input')
# 输入收件人
receiver.send_keys("xxxx")
subject = self.driver.find_element_by_xpath\
('//input[@ng-model="mail.subject"]')
# 输入邮件标题
subject.send_keys(u"一封测试邮件!")
# 输入完邮件标题后,按下Tab键可以将页面焦点切换到富文本框编辑区域
subject.send_keys(Keys.TAB)
# 设置剪切板内容,也就是将要输入的正文内容
setText(u"邮件正文内容")
# 模拟键盘的Ctrl + v组合键,将剪切板内容粘贴到富文本编辑区中
keyDown("ctrl")
keyDown("v")
keyUp("v")
keyUp("ctrl")
# 找到页面上的“发送”按钮,并单击它
self.driver.find_element_by_xpath('//span[.="发送"]').click()
# 显示都等待含有关键字串“发送成功”的页面元素出现在页面中
wait.until(EC.visibility_of_element_located\
((By.XPATH, '//span[.="发送成功"]')))
print u"邮件发送成功"
except TimeoutException:
print u"显示等待页面元素超时"
except NoSuchElementException:
print u"寻找的页面元素不存在", traceback.print_exc()
except Exception:
# 打印其他异常堆栈信息
print traceback.print_exc() def tearDown(self):
# 退出IE浏览器
self.driver.quit() if __name__ == '__main__':
unittest.main()
优点:不管任何类型的富文本框,只要找到它上面的近邻近邻元素,然后通过模拟按Tab键的方式均可进入到富文本框,有此可以使用一种方法解决所有类型的富文本框定位问题。
缺点:不能在富文本框编辑器中进行HTML格式的内容输入。
webdriver高级应用- 操作富文本框的更多相关文章
- python webdriver api-操作富文本框
操作富文本框-就是邮件正文部分,可以选字体啥的 第一种方式: 一般都是在iframe里,要切进去,一般是”html/body”,编辑之后,再切出来,然后再send_keys就完事儿 #encoding ...
- Selenium示例集锦--常见元素识别方法、下拉框、文本域及富文本框、鼠标操作、一组元素定位、弹窗、多窗口处理、JS、frame、文件上传和下载
元素定位及其他操作 0.常见的识别元素的方法是什么? driver.find_element_by_id() driver.find_element_by_name() driver.find_ele ...
- django(7)modelform操作及验证、ajax操作普通表单数据提交、文件上传、富文本框基本使用
一.modelForm操作及验证 1.获取数据库数据,界面展示数据并且获取前端提交的数据,并动态显示select框中的数据 views.py from django.shortcuts import ...
- Java + selenium 元素定位(6)之iframe切换(即对富文本框的操作)
在元素定位中,对富文本框的元素定位是特别的,当我们使用普通的元素定位方法对富文本框进行操作时,我们会发现不管我们之前介绍的八种方法中的任何方法,我们都不能成功定位到富文本框,并对其进行操作.那是因为富 ...
- vue集成CKEditor构建框架的使用,遇到富文本框不出现工具栏等操作
官方关于Vue集成CKEditor富文本框的文档:https://ckeditor.com/docs/ckeditor5/latest/builds/guides/integration/framew ...
- Selenium常用API用法示例集----下拉框、文本域及富文本框、弹窗、JS、frame、文件上传和下载
元素识别方法.一组元素定位.鼠标操作.多窗口处理.下拉框.文本域及富文本框.弹窗.JS.frame.文件上传和下载 元素识别方法: driver.find_element_by_id() driver ...
- H5页面设计器,仿有赞商城页面在线设计器,比富文本框更友好的内容编辑器
基本上每个web应用,都会牵扯到内容编辑,尤其是移动的web应用,微信开发之类的.页面内容自定义是最常用的功能了,之前大部分解决方案都是采用富文本框编辑器kindeditor,ueditor,cked ...
- Android 富文本框实现 RichEditText
Android系统自带控件没有富文本框控件,如果想写一封带格式的邮件基本上不可能,EdtiText只有默认一种格式,显示不能滿足要求,!!正好项目需要研究了一下,开发了此控件,现将一些源代码开放一下, ...
- 第三百九十五节,Django+Xadmin打造上线标准的在线教育平台—Xadmin集成富文本框
第三百九十五节,Django+Xadmin打造上线标准的在线教育平台—Xadmin集成富文本框 首先安装DjangoUeditor3模块 Ueditor HTML编辑器是百度开源的HTML编辑器 下载 ...
随机推荐
- Java分页下载
需求.提供公共的可以按照一定条件查询出结果,并提供将查询结果全部下载功能(Excel.CSV.TXT),由于一次性查出结果放到内存会占用大量内存.需要支持分页模式查询出所有数据. 实现思路 1.在公共 ...
- deb软件安装
deb是debian linux的安装格式,跟red hat的rpm非常相似,最基本的安装命令是:dpkg -i file.deb dpkg 是Debian Package的简写,是为Debian 专 ...
- iOS 应用架构 (二)
iOS 客户端应用架构看似简单,但实际上要考虑的事情不少.本文作者将以系列文章的形式来回答 iOS 应用架构中的种种问题,本文是其中的第二篇,主要讲 View 层的组织和调用方案.上篇主要讲 View ...
- 投资20万研发的JFinal项目《旅游线路营销管理系统》准备公开课中
18年初上线了一套旅游营销管理系统,目前给几个合作客户内测试用,是基于JFinal研发的一套旅游行业旅游线路批发零售系统(SAAS)版. 系统终端: PC后台管理分:总部.线路批发商.旅行社门店.个人 ...
- iOS中转义后的html标签如何还原
最近用swift做一个公司的小项目,遇到一个问题,就是通过api获取的html文本中的标签都已经被转义了, <p class="MsoNormal" align=" ...
- 【TensorFlow入门完全指南】神经网络篇·卷积神经网络
加载数据集. 这里的keep_prob是dropout的一个参数.dropout是一种随机置零的策略,用来防止模型过拟合. 这里定义两层,上面是卷积层,下面是池化层. 搭建了一层卷积.一层池化.一层卷 ...
- noip模拟赛#45
T1:n<=1e6,求最小的区间包含(1,m)的所有数. =>双指针扫一遍即可 #include<cstdio> #include<cstring> #includ ...
- 正确配置Nginx+PHP
对很多人而言,配置Nginx+PHP无外乎就是搜索一篇教程,然后拷贝粘贴.听上去似乎也没什么问题,可惜实际上网络上很多资料本身年久失修,漏洞百出,如果大家不求甚解,一味的拷贝粘贴,早晚有一天会为此付出 ...
- 导入文件 服务器报错,有可能是 开发时候是window 服务器是linux,两个系统的文件系统的/和\是相反的,要注意这块
导入文件 服务器报错,有可能是 开发时候是window 服务器是linux,两个系统的文件系统的/和\是相反的,要注意这块
- Eclipse:Win10中设置Courier New字体
问题:在Eclipse中设置字体的时候,没有找到Courier New字体.系统为Win10. 解决:Eclipse使用的字体为系统字体.在系统字体中有一部分是隐藏的.Courier New已经在系统 ...