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("[email protected]")
            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("1111")
            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("[email protected]")
            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("1111")
            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格式的内容输入。

原文地址:https://www.cnblogs.com/qingqing-919/p/8716556.html

时间: 2024-10-11 03:50:44

webdriver高级应用- 操作富文本框的相关文章

操作富文本框

富文本框常见的技术用到了Frame标签,并且在Frame里面实现了一个完整的HTML网页结构. 方法一: #!usr/bin/env python #-*- coding:utf-8 -*- """ @author: sleeping_cat @Contact : [email protected] """ #操作富文本框 from selenium import webdriver import unittest,traceback,time

python-selenium -- 富文本框操作

一.div普通文本 百度搜索框,通过.send_keys()方法 #定位百度搜索框 driver.find_element_by_id("kw").send_keys("python") time.sleep(3) driver.find_element_by_id("su").click() 二.textarea富文本框 博客园评论区,通过js的.value 方法 from selenium import webdriver import ti

轻量级web富文本框——wangEditor使用手册(2)——扩展一个“缩进”功能

1. 引言 上一节<轻量级web富文本框——wangEditor使用手册(1)——基本应用>中我们讲解了如何应用wangEditor创建最基本的富文本编辑器,本节继续讲如何扩展一个简单的按钮.本节是继续上一节的内容来的,所使用的代码也是接着上一节的来的,错过的朋友请先看上一节,再看本节. 下载地址:https://github.com/wangfupeng1988/wangEditor demo演示:http://www.cnblogs.com/wangfupeng1988/p/4185508

轻量级web富文本框——wangEditor使用手册(4)——配置下拉菜单

1. 引言 上一节(第三节)<轻量级web富文本框——wangEditor使用手册(3)——如何自定义配置菜单>描述了如何自定义配置一个新加入的菜单.在第二节中我们演示了如何添加一个简单的菜单,这一节我们要加入一个稍微复杂一点的菜单——下拉菜单类型——增加一个“设置标题”下拉按钮 下载地址:https://github.com/wangfupeng1988/wangEditor demo演示:http://www.cnblogs.com/wangfupeng1988/p/4185508.htm

基于bootstrap的富文本框——wangEditor【欢迎加入开发】

先来一张效果图: 01. 引言 老早就开始研究富文本框的东西,在写完<深入理解javascript原型与闭包>之后,就想着要去做一个富文本框的插件的例子. 现在网络上开源的富文本框插件非常多,一搜索一大堆,但是基于bootstrap的还不多,现在只有一个“bootstrap-wysiwyg”,老外写的,没有一个汉字,大家可以fork一下源码看看,写的非常简洁,压缩之后不到10KB,非常厉害!我也还没来得及研究,一定要看一下. 02. wangEditor 老外的东西,满地英文,给程序猿用着还可

基于bootstrap的富文本框——wangEditor【欢迎增加开发】

先来一张效果图: 01. 引言 老早就開始研究富文本框的东西,在写完<深入理解javascript原型与闭包>之后,就想着要去做一个富文本框的插件的样例. 如今网络上开源的富文本框插件许多,一搜索一大堆,可是基于bootstrap的还不多.如今仅仅有一个"bootstrap-wysiwyg".老外写的,没有一个汉字.大家能够fork一下源代码看看,写的很简洁.压缩之后不到10KB.很厉害!我也还没来得及研究,一定要看一下. 02. wangEditor 老外的东西,满地英文

轻量级web富文本框——wangEditor使用手册(3)——如何自定义配置菜单

1. 引言 上一节<轻量级web富文本框——wangEditor使用手册(2)——扩展一个“缩进”功能>最后提到,新建的菜单不能只是默认放在菜单的后面,应该可以自定义的放在当前菜单栏中的任何位置.这一节就讲述wangEditor目前支持的几种自定义配置菜单的使用. 下载地址:https://github.com/wangfupeng1988/wangEditor demo演示:http://www.cnblogs.com/wangfupeng1988/p/4185508.html 交流QQ群:

Selenium向iframe富文本框输入内容

目录 前言 只输入纯文本 通过JS注入HTML代码 前言 在使用Selenium测试一些CMS后台系统时,有时会遇到一些富文本框,如下图所示: 整个富文本编辑器是通过iframe嵌入到网页中的,手动尝试输入内容,发现内容是输入到iframe页面的body中的, 这种富文本框怎么输入呢? 我们也可以直接在body的源码上点击右键选择Edit HTML,输入相应的html代码,达到向富文本框输入的目的,如下下图: 以下是使用Selenium的操作方法 只输入纯文本 如果只输入不带格式的纯文本,可以先

selenium处理富文本框,日历控件等 调用JS修改value值

http://blog.csdn.net/fudax/article/details/8089404 document.getElementById("js_domestic_fromdate").value = "2014-10-10" selenium处理富文本框,日历控件等 调用JS修改value值,布布扣,bubuko.com