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)
05-11 13:00