webDriver基本运用

import time
from selenium import webdriver
import unittest
import HTMLTestRunner
# webDriver基本应用
class TestWebdriver(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.url = "http://www.baidu.com"

    def tearDown(self):
        self.driver.quit()

    def test_visitRcentURL(self):
        firstVisitURL = "http://www.sogou.com"
        secondVisitURL = "http://www.baidu.com"
        self.driver.get(firstVisitURL)
        self.driver.get(secondVisitURL)
        time.sleep(5)
        # 后退
        self.driver.back()
        # 前进
        self.driver.forward()
        time.sleep(5)
        self.driver.quit()


    def test_refreshCurrentPage(self):
        url = "http://www.soguu.com"
        self.driver.get(url)
        time.sleep(5)
        #刷新当前页面
        self.driver.refresh()
        self.driver.quit()

    def test_maximizeWindow(self):
        url = "http://www.baidu.com"
        #最大化浏览器窗口
        self.driver.get(url)
        self.driver.maximize_window()
        self.driver.quit()

    def test_window_position(self):
        url = "http://www.baidu.com"
        self.driver.get(url)
        # 获取当前浏览器在屏幕上的位置,返回的是字典
        position = self.driver.get_window_position()
        print("当前浏览器所在位置的横坐标",position['x'])
        print("当前浏览器所在位置的纵坐标",position['y'])
        # 设置当前浏览器的屏幕上的位置
        self.driver.set_window_position(x = 200,y = 400)
        # 获取设置后浏览器的位置
        print(self.driver.get_window_position())
        self.driver.quit()

    def test_window_size(self):
        url = "http://www.baidu.com"
        self.driver.get(url)
        # 获取浏览器大小,返回一个数组
        sizeDict = self.driver.get_window_size()
        print('当前浏览器的宽',sizeDict['width'])
        print('当前浏览器的高',sizeDict['height'])
        self.driver.set_window_size(width=200,height=400,windowHandle='current')
        print('再次获取设置后浏览器大小',
              self.driver.get_window_size(windowHandle='current'))
        self.driver.quit()

    # 获取当前页面的title
    def test_getTitle(self):
        self.driver.get(self.url)
        print('获取当前页面的title',self.driver.title)

    # 获取当前页面的源码
    def test_getPageSource(self):
        self.driver.get(self.url)
        # 获取当前页面的源码
        pageSuurce = self.driver.page_source
        print(pageSuurce)
        self.assertEqual(u'新闻'in pageSuurce,"页面源码中未找到新闻关键字")

    # 获取当前页面URL地址
    def test_getCurrentPageUrl(self):
        self.driver.get(self.url)
        currentUrl=self.driver.current_url
        print('获取当前地址',currentUrl)
        self.assertEqual(currentUrl,"https://www.baidu.com",'当前页面非预期')

    # 获取与切换浏览器窗口句柄
    def test_operateWindowHandle(self):
        self.driver.get(self.url)
        # 获取当前句柄
        now_handle = self.driver.current_window_handle
        print('获取当前句柄',now_handle)
        self.driver.find_element(by="id",value= "kw").send_keys("w3cschool")
        self.driver.find_element(by="id",value= "su").click()
        time.sleep(3)
        self.driver.find_element(by="partial link text",value="百度百科").click()
        time.sleep(5)
        # 获取所有句柄
        all_handles = self.driver.window_handles
        print("++++++",self.driver.window_handles[-1])
        for handle in all_handles:
            if handle == now_handle:
                print("句柄相同",handle)

            print(handle)

    # 获取页面元素的基本信息
    def test_getBasicInfo(self):
        self.driver.get(self.url)
        newElement = self.driver.find_element(by="link text",value='新闻')
        # 获取新闻元素的基本信息
        print('元素的标签名',newElement.tag_name)
        print('元素的size:',newElement.size)

    # 获取页面元素的文本内容
    def test_getWebElementText(self):
        self.driver(self.url)
        aElement = self.driver.find_element(by="link text", value='新闻')
        a_text = aElement.text
        self.assertEqual(a_text, u'新闻')

    # 判断页面元素是否可见
    def test_getWebElementIsDisplayed(self):
        self.driver.get(self.url)
        text = self.driver.find_element(by="link text", value='新闻')
        print('判断新闻是否可见',text.is_displayed())

    # 判断页面元素是否可操作
    def test_getWebElementIsEnabled(self):
        self.driver.get(self.url)
        text1 = self.driver.find_element(by="link text", value='新闻')
        print('判断新闻是否可操作',text1.is_enabled())

    # 获取页面元素的属性
    def test_getWebElementAttribute(self):
        self.driver.get(self.url)
        searchBox = self.driver.find_element(by="id", value="kw")
        print("搜索输入框name的属性值",searchBox.get_attribute('name'))
        searchBox.send_keys(u"上海诸毅管道工程有限公司")
        print('搜索框中value值',searchBox.get_attribute('value'))

    # 获取页面元素的css属性值
    def test_getWebElementCssValue(self):
        self.driver.get(self.url)
        searchBox = self.driver.find_element(by="id", value="kw")
        print('搜索输入框的高度',searchBox.value_of_css_property("height"))
        print('搜索输入框的宽度', searchBox.value_of_css_property("width"))
        font = searchBox.value_of_css_property("font - family")
        self.assertEqual(font,"arial")

    # 清空输入框中的内容
    def test_clearInputBoxText(self):
        self.driver.get(self.url)
        searchBox = self.driver.find_element(by="id", value="kw")
        searchBox.send_keys(u"上海诸毅管道工程有限公司")
        time.sleep(3)
        searchBox.clear()
        time.sleep(3)

    # 双击某个元素
    def test_doubleClick(self):
        self.driver.get(self.url)
        inputBox=self.driver.find_element(by="id", value="su")
        # 导入支持双击操作模块
        from selenium.webdriver import ActionChains
        # 开始双击操作
        action_chains =  ActionChains(self.driver)
        action_chains.double_click(inputBox).perform()
        time.sleep(3)

    # 操作单选下拉框
    def test_printSelectText(self):
        url = "F:\\tset1.html"
        self.driver.get(url)
        select = self.driver.find_element_by_name('fruit')
        # 因为all_options是一组元素所以使用driver.find_elements_by_tag_name
        all_options = self.driver.find_elements_by_tag_name('option')
        for option in all_options:
            print("选项显示文本",option.text)
            print("选项值",option.get_attribute("value"))
            option.click()
        time.sleep(3)

    # 选择下拉列表元素的三种方法
    def test_operateDropList(self):
        url = "F:\\tset1.html"
        self.driver.get(url)
        # 导入select模块
        from selenium.webdriver.support.ui import Select
        select_element = Select(self.driver.find_element_by_xpath('//select'))
        print('打印默认选中的文本',select_element.first_selected_option.text)
        # 获取所有选择项的页面元素对象
        all_options = select_element.options
        print('打印总个数',len(all_options))
        '''
        is_enabled()判断元素是否可操作
        is_selected()判断元素是否被选中
        '''
        # 判断需要的元素是可以操作并且不被选中
        if all_options[1].is_enabled() and not all_options[1].is_selected():
            # 方法一:通过序号选中第二个元素,序号从0开始
            select_element.select_by_index(1)
            print('打印已经选中的文本',select_element.all_selected_options[0].text)
            self.assertEqual(select_element.all_selected_options[0].text,u'西瓜')
        time.sleep(3)
        # 方法二:通过选项的显示文本选择文本为猕猴桃选项
        select_element.select_by_visible_text("猕猴桃")
        # 断言已选中项的文本是否是猕猴桃
        print('被选中的文本值',select_element.all_selected_options[0].text)
        self.assertEqual(select_element.all_selected_options[0].text,u'猕猴桃')
        time.sleep(3)
        # 方法三:通过选项的value属性值选择value = "shanzha"选项
        select_element.select_by_value("shanzha")
        print('被选中的文本值',select_element.all_selected_options[0].text)
        self.assertEqual(select_element.all_selected_options[0].text,u'山楂')

    # 断言单选列表选项值
    def test_checkSelectText(self):
        url = "F:\\tset1.html"
        self.driver.get(url)
        # 导入select模块
        from selenium.webdriver.support.ui import Select
        select_element = Select(self.driver.find_element_by_xpath('//select'))
        # 获取页面中所有选项的元素对象
        actual_options = select_element.options
        # 声明一个List对象,存储下拉列表中所期望出现的文字内容
        expect_optionsList = [u"桃子",u"西瓜",u"橘子",u"猕猴桃",u"山楂",u"荔枝"]
        # 使用map()函数获取页面中下拉列表展示的选项内容组成的列表对象
        actual_optionsList = list(map(lambda option: option.text,actual_options))
        # 断言期望列表对象和实际列表对象是否完全一致
        self.assertEqual(expect_optionsList,actual_optionsList)

    # 操作多选的选择列表
    def test_operateMultipleOptionDropList(self):
        url = "F:\\tset2.html"
        self.driver.get(url)
        # 导入select模块
        from selenium.webdriver.support.ui import Select
        time.sleep(2)
        select_element = Select(self.driver.find_element_by_xpath('//select'))
        # 通过序号选择第一个元素
        select_element.select_by_index(0)
        # 通过选项的文本选择山楂选项
        select_element.select_by_visible_text("山楂")
        # 通过选项的value属性值选择value = "mihoutao"
        select_element.select_by_value("mihoutao")
        # 打印所有的选中项
        for option in select_element.all_selected_options:
            print('所有选中的文本:',option)
        # 取消所有已选中项
        select_element.deselect_all()
        time.sleep(2)
        print("-------------再次选中3个选项--------------")
        select_element.select_by_index(1)
        time.sleep(2)
        select_element.select_by_visible_text("荔枝")
        select_element.select_by_value("jvzi")
        # 通过选项文本取消已选中的文本为"荔枝"
        select_element.deselect_by_visible_text("荔枝")
        # 通过序号取消已选中的序号为1的选项
        select_element.deselect_by_index(1)
        # 通过选项的value属性取消已选中的value = "jvzi"的选项
        select_element.deselect_by_value("jvzi")

    # 操作可以输入的下拉列表
    def test_operateMultipleOptionDropList(self):
        url = "F:\\tset3.html"
        self.driver.get(url)
        from selenium.webdriver.common.keys import Keys
        self.driver.find_element_by_id("select").clear()
        time.sleep(3)
        # 输入的同事按下箭头键
        self.driver.find_element_by_id("select").send_keys("c",Keys.ARROW_DOWN)
        self.driver.find_element_by_id("select").send_keys( Keys.ARROW_DOWN)
        self.driver.find_element_by_id("select").send_keys( Keys.ARROW_DOWN)
        time.sleep(3)

    # 操作单选框
    def test_operateRadio(self):
        url = "F:\\tset4.html"
        self.driver.get(url)
        berryRadio = self.driver.find_element_by_xpath("//input[@value='berry']")
        berryRadio.click()
        # 断言“草莓”单选框未成功选中
        self.assertTrue(berryRadio.is_selected(),u'草莓单选框未被选中')
        time.sleep(2)
        if berryRadio.is_selected():
            watermelonRadio = self.driver.find_element_by_xpath("//input[@value='watermelon']")
            watermelonRadio.click()
            self.assertFalse(berryRadio.is_selected())
        radioList= self.driver.find_elements_by_xpath("//input[@name = 'fruit']")

        for radio in radioList:
            print(radio.get_attribute("value"))
            if radio.get_attribute("value") == "orange":
                time.sleep(3)
                if not radio.is_selected():
                    radio.click()
                    self.assertEqual(radio.get_attribute("value"),"orange")

    # 使用Title属性识别和操作新弹出的浏览器窗口
    def test_identifyPopUpWindowByTitle(self):
        from selenium.common.exceptions import NoSuchAttributeException,TimeoutException
        from selenium.webdriver.support import expected_conditions as Ec
        from selenium.webdriver.common.by import By
        from selenium.webdriver.support.ui import WebDriverWait
        import traceback
        url = "F:\\tse5.html"
        self.driver.get(url)
        WebDriverWait(self.driver,10,0.2).until(Ec.element_to_be_clickable(
            (By.LINK_TEXT,'sogou搜索')
        )).click()
        all_handles = self.driver.window_handles
        print(self.driver.current_window_handle)
        print(len(all_handles))
        time.sleep(3)
        if len(all_handles)>0:
            try:
                for windowHandle in all_handles:
                    self.driver.switch_to.window(windowHandle)
                    print(self.driver.title)
                    if self.driver.title == u"搜狗搜索引擎 - 上网从搜狗开始":
                        WebDriverWait(self.driver,10,0.2).until(
                            lambda x: x.find_element_by_id("query")).send_keys(
                                u"sogou首页的浏览器窗口被找到")
                        time.sleep(2)
            except NoSuchAttributeException:
                print(traceback.print_exc())
            except TimeoutException:
                print(traceback.print_exc())
        time.sleep(3)
        self.driver.switch_to.window(all_handles[0])
        print(self.driver.title)
        time.sleep(3)
        self.assertEqual(self.driver.title,u"你喜欢的水果")

    # 操作Frame中的页面元素
    def test_HandleFrame(self):
        from selenium.webdriver.support import expected_conditions as Ec
        from selenium.webdriver.support.ui import WebDriverWait
        from  selenium.common.exceptions import TimeoutException
        url = "F:\\frameset.html"
        self.driver.get(url)
        # 使用索引方式进入指定的frame页面,索引号从0开始
        # 所以想进入中间的frame,需要使用索引号1
        # 如果没有使用此行代码,则无法找到页面中左侧frame 中的任何页面元素
        self.driver.switch_to.frame(0)
        # 找到左侧frame中的p标签元素
        leftFrameText=self.driver.find_element_by_xpath("//p")
        # 断言左侧frame中的文字是否和"这是左侧frame页面上的文字"几个关键字相一致
        self.assertAlmostEqual(leftFrameText.text,u"这是左侧frame页面上的文字")
        # 找到左侧frame中的按钮元素,并单击该元素
        self.driver.find_element_by_tag_name("input").click()
        try:
            # 动态等待alert窗口出现
            alertWindow = WebDriverWait(self.driver,10).until(
                Ec.alert_is_present())
            print('打印alert信息',alertWindow.text)
            alertWindow.accept()
        except TimeoutException:
            print("超时")
        # 使用driver.switchTo.default_content方法,从左侧frame中返回到frameset页面
        # 如果不调用此行代码,则无法从左侧frame页面中直接进入其他frame页面
        self.driver.switch_to.default_content()
        # 通过标签名找到页面中所有的frame元素,然后通过索引进入该frame
        self.driver.switch_to.frame(self.driver.find_elements_by_tag_name("frame")[1])
        # 断言页面源码中是否存在"这是中间frame页面上的文字"关键字串
        assert u"这是中间frame页面上的文字" in self.driver.page_source
        # 在输入框中输入"我在中间frame"
        self.driver.find_element_by_tag_name("input").send_keys(u"我在中间frame")
        time.sleep(3)
        self.driver.switch_to.default_content()

        self.driver.switch_to.frame(self.driver.find_element_by_id("rightframe"))
        assert u"这是右侧frame页面上的文字" in self.driver.page_source
        time.sleep(3)
        self.driver.switch_to.default_content()

    # 使用Frame中的HTML源码内容操作Frame
    def test_HandleFrameByPageSource(self):
        url = "F:\\frameset.html"
        self.driver.get(url)
        # 找到页面上的所有frame页面对象,并储存到名为framesList列表中
        framesList = self.driver.find_elements_by_tag_name("frame")
        # 通过for循环遍历framesList中所有的frame页面,查找页面源码中含有"中间frame"的frame页面
        frame = 0
        for frame in range(len(framesList)):
            # 进入到frame页面
            time.sleep(2)
            self.driver.switch_to.frame(frame)
            # 判断每个frame的HTML源码中是否包含"中间frame"几个关键字
            time.sleep(2)
            if u"中间frame" in self.driver.page_source:
                # 如果包含需要查找的关键字,则查找到页面上的p标签元素
                time.sleep(2)
                p = self.driver.find_element_by_xpath("//p")
                # 断言页面上p元素文本内容是否是"这只中间frame页面上的文字"
                time.sleep(2)
                self.assertAlmostEqual(u"这是中间frame页面上的文字",p.text)
                # 退出frame
                self.driver.switch_to.default_content()
                break
            else:
                # 如果没找到指定frame,则调用此行代码,返货到frameset页面中
                # 以便下次for循环中能继续调用driver.switch_to.frame方法,否则会报错
                self.driver.switch_to.default_content()




if __name__ == "__main__":
   unittest.main()
   # suite = unittest.TestSuite()
   # suite.addTest(TestWebdriver("test_doubleClick"))
   # runner = unittest.TextTestRunner()
   # runner.run(suite)

 

posted @ 2019-03-16 12:39  猫先生喵喵  阅读(237)  评论(0编辑  收藏  举报