• 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("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("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("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格式的内容输入。

  • 相关阅读:
    订单生成案例详解
    分页案例详解
    简单的多条件查询案例
    删除选中案例详解
    转账汇款案例
    登录操作记住用户名实现
    根据自定义异常来回显错误信息
    会话技术cookie和session详解
    JDBC
    Netty入门教程——认识Netty
  • 原文地址:https://www.cnblogs.com/qingqing-919/p/8716556.html
Copyright © 2020-2023  润新知