02-selenium的进一步学习(控制浏览器窗口+)

1、控制浏览器窗口

 

WebDriver 提供的 set_window_size()方法可以用来设置浏览器窗口大小。

"""
* name			      →		find_element_by_name()
* tag_name            →    find_element_by_tag_name()
* class_name		  →		find_element_by_class_name()
* link_text			  →		find_element_by_link_text()
* partial_link_text   →    find_element_by_partial_link_text()
* xpath				  →	    find_element_by_xpath()
* css_selector        →		find_element_by_css_selector()
"""
from selenium import webdriver

driver = webdriver.Chrome()

# id 定位
driver.find_element_by_id("kw")
driver.find_element_by_id("su")

# name 定位
driver.find_element_by_name("wd")

# class 定位
driver.find_element_by_class_name("s_ipt")

# tag定位
driver.find_element_by_tag_name("input")

# link text定位
driver.find_element_by_link_text("新闻")
driver.find_element_by_link_text("hao123")
driver.find_element_by_link_text("地图")
driver.find_element_by_link_text("视频")
driver.find_element_by_link_text("贴吧")

# partial link定位
driver.find_element_by_partial_link_text("一个很长的")
driver.find_element_by_partial_link_text("文本链接")

# XPath 定位
# 1、绝对路径定位
driver.find_element_by_xpath("/html/body/div/div[2]/div/div/div/from/span/input")
driver.find_element_by_xpath("/html/body/div/div[2]/div/div/div/from/span[2]/input")

# 2、利用元素属性定位
driver.find_element_by_xpath("//input[@id='kw']")
driver.find_element_by_xpath("//input[@id='su']")
driver.find_element_by_xpath("//*[@name='wd']")
driver.find_element_by_xpath("//*[@class='s_ipt']")
driver.find_element_by_xpath("//input[@maxlength='100']")
driver.find_element_by_xpath("//input[@autocomplete='off']")
driver.find_element_by_xpath("//input[@type='submit']")

# 3、层级与属性结合
driver.find_element_by_xpath("//span[@class='bg s_ipt_wr']/input")
driver.find_element_by_xpath("//form[@id='form']/span/input")
driver.find_element_by_xpath("//form[@id='form']/span[2]/input")

# 4、使用逻辑运算符
driver.find_element_by_xpath("//input[@id='kw' and @class='s_ipt']")

# 5、使用contains方法
driver.find_element_by_xpath("//span[contains(@calss,'s_ipt_wr')]/input")

# 6、使用text()方法
driver.find_element_by_xpath("//a[text(),'新闻')]")

driver.find_element_by_xpath("//a[contains(text(),'一个很长的')]")


# CSS 定位
# 1.通过class属性定位
driver.find_element_by_css_selector(".s_ipt")
driver.find_element_by_css_selector(".s_btn")

# 2、通过id属性定位
driver.find_element_by_css_selector("#kw")
driver.find_element_by_css_selector("#su")

# 3、通过标签名定位
driver.find_element_by_css_selector("input")

# 4、通过标签层级关系定位
driver.find_element_by_css_selector("span > input")

# 5、通过属性定位
driver.find_element_by_css_selector("[autocomplete=off]")
driver.find_element_by_css_selector("[name='kw']")
driver.find_element_by_css_selector('[type="submit"]')

# 6、组合定位
driver.find_element_by_css_selector("form.fm > span > input.s_ipt")
driver.find_element_by_css_selector("form#form > span > input#kw")

# 7、更多定位用法
driver.find_element_by_css_selector("[class*=s_ipt_wr]")
driver.find_element_by_css_selector("[class^=bg]")
driver.find_element_by_css_selector("[class$=wrap]")
driver.find_element_by_css_selector("form > input:nth-child(2)")
"""
*  back()     后退
*  forward()  前进
*  refresh()  刷新
"""
from selenium import webdriver

driver = webdriver.Chrome()

# 访问百度首页
first_url = 'http://www.baidu.com'
print("now access %s" %(first_url))
driver.get(first_url)

# 访问新闻页面
second_url = 'http://news.baidu.com'
print("now access %s" %(second_url))
driver.get(second_url)

# 返回(后退)到百度首页
print("back to  %s " %(first_url))
driver.back()

# 前进到新闻页
print("forward to  %s" %(second_url))
driver.forward()

driver.refresh()  # 刷新当前页面

driver.quit()
"""
*  set_window_size()   设置浏览器宽、高
*  maximize_window()   设置浏览器全屏
"""
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://m.baidu.com")

# 参数数字为像素点
print("设置浏览器宽480、高800显示")
driver.set_window_size(480, 800)

# 设置浏览器全屏
driver.maximize_window()

driver.quit()
"""
* name             →       find_element_by_name()
* tag_name            →    find_element_by_tag_name()
* class_name        →       find_element_by_class_name()
* link_text            →       find_element_by_link_text()
* partial_link_text   →    find_element_by_partial_link_text()
* xpath               →        find_element_by_xpath()
* css_selector        →       find_element_by_css_selector()
"""
"""
*  back()     后退
*  forward()  前进
*  refresh()  刷新
"""

例子:   driver.refresh()   #刷新当前页面

"""
*  set_window_size()   设置浏览器宽、高
*  maximize_window()   设置浏览器全屏
"""

2.WebDriver 中的常用方法

"""
*  clear():				清除文本。
*  send_keys(*value):	模拟按键输入。
*  click():				单击元素。
*  size     返回元素的尺寸。
*  text     获取元素的文本。
*  get_attribute(name)   获得属性值。
*  is_displayed()        设置该元素是否用户可见。
"""
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")

driver.find_element_by_id("kw").clear()
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()

# submit 提交表单
search_text = driver.find_element_by_id('kw')
search_text.send_keys('selenium')
search_text.submit()

# 获得输入框的尺寸
size = driver.find_element_by_id('kw').size
print(size)

# 返回百度页面底部备案信息
text = driver.find_element_by_id("cp").text
print(text)

# 返回元素的属性值,可以是 id、 name、 type 或其他任意属性
attribute = driver.find_element_by_id("kw").get_attribute('type')
print(attribute)

# 返回元素的结果是否可见,返回结果为 True 或 False
result = driver.find_element_by_id("kw").is_displayed()
print(result)

driver.quit()
"""
*  clear():             清除文本。
*  send_keys(*value):  模拟按键输入。
*  click():             单击元素。
*  submit():提交表单
*  size     返回元素的尺寸。
*  text     获取元素的文本。
*  get_attribute(name)   获得属性值。
*  is_displayed()        设置该元素是否用户可见。
"""
(4)submit():提交表单。

例如,有些搜索框不提供搜索按钮,而是通过按键盘上的回车键完成搜索内容的提交,

这时可以通过 submit()模拟。

3、鼠标操作

"""
* perform() 执行所有 ActionChains 中存储的行为;
* context_click() 右击;
* double_click() 双击;
* drag_and_drop() 拖动;
* move_to_element() 鼠标悬停。
"""
from selenium import webdriver
# 引入 ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains


driver = webdriver.Chrome()
driver.get("https://www.baidu.com")

# 定位到要鼠标悬停的元素
above = driver.find_element_by_link_text("设置")
# 对定位到的元素执行鼠标悬停操作
ActionChains(driver).move_to_element(above).perform()

# ……
# 引入 ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains
"""
* perform() 执行所有 ActionChains 中存储的行为;
* context_click() 右击;
* double_click() 双击;
* drag_and_drop() 拖动;
* move_to_element() 鼠标悬停。
"""

4、键盘操作

"""
* send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
* send_keys(Keys.SPACE) 空格键(Space)
* send_keys(Keys.TAB) 制表键(Tab)
* send_keys(Keys.ESCAPE) 回退键(Esc)
* send_keys(Keys.ENTER) 回车键(Enter)
* send_keys(Keys.CONTROL,'a') 全选(Ctrl+A)
* send_keys(Keys.CONTROL,'c') 复制(Ctrl+C)
* send_keys(Keys.CONTROL,'x') 剪切(Ctrl+X)
* send_keys(Keys.CONTROL,'v') 粘贴(Ctrl+V)
* send_keys(Keys.F1) 键盘 F1
  ……
* send_keys(Keys.F12) 键盘 F12
"""
from selenium import webdriver
# 引入Keys模块
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")

# 输入框输入内容
driver.find_element_by_id("kw").send_keys("seleniumm")

# 删除多输入的一个m
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)

# 输入空格键+“教程”
driver.find_element_by_id("kw").send_keys(Keys.SPACE)
driver.find_element_by_id("kw").send_keys("教程")

# ctrl+a 全选输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'a')

# ctrl+x 剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'x')

# ctrl+v 粘贴内容到输入框
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'v')

# 通过回车键来代替单击操作
driver.find_element_by_id("su").send_keys(Keys.ENTER)

driver.quit()
# 引入Keys模块
from selenium.webdriver.common.keys import Keys
"""
* send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
* send_keys(Keys.SPACE) 空格键(Space)
* send_keys(Keys.TAB) 制表键(Tab)
* send_keys(Keys.ESCAPE) 回退键(Esc)
* send_keys(Keys.ENTER) 回车键(Enter)
* send_keys(Keys.CONTROL,'a') 全选(Ctrl+A)
* send_keys(Keys.CONTROL,'c') 复制(Ctrl+C)
* send_keys(Keys.CONTROL,'x') 剪切(Ctrl+X)
* send_keys(Keys.CONTROL,'v') 粘贴(Ctrl+V)
* send_keys(Keys.F1) 键盘 F1
  ……
* send_keys(Keys.F12) 键盘 F12
"""

5、获得验证信息

在进行 Web 自动化测试中,用得最多的几种验证信息是 titlecurrent_url  text

title:用于获取当前页面的标题。

current_url:用于获取当前页面的 URL

text:用于获取当前页面的文本信息。

"""
*  title         获取当前页面title
*  current_url   获取当前页面URL
*  text          获得文本信息
"""
from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
print('Before search================')

# 打印当前页面title
title = driver.title
print("title:"+ title)

# 打印当前页面URL
now_url = driver.current_url
print("URL:"+now_url)

driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
sleep(2)

print('After search================')

# 再次打印当前页面title
title = driver.title
print("title:"+title)

# 打印当前页面URL
now_url = driver.current_url
print("URL:"+now_url)

# 获取搜索结果条数
num = driver.find_element_by_class_name('nums').text
print("result:"+num)

driver.quit()
"""
*  title         获取当前页面title
*  current_url   获取当前页面URL
*  text          获得文本信息
"""

6、设置元素等待

显式等待

显式等待是  WebDriver  等待某个条件成立则继续执行,否则在达到最大时长时抛出超

时异常(TimeoutException)。

WebDriverWait(driver,  timeout,  poll_frequency=0.5,  ignored_exceptions=None)

	driver:浏览器驱动。
	timeout:最长超时时间,默认以秒为单位。
	poll_frequency:检测的间隔(步长)时间,默认为 0.5s。
	ignored_exceptions:超时后的异常信息,默认情况下抛出 NoSuchElementException
异常。
WebDriverWait()一般与  until()或  until_not()方法配合使用,下面是  until()和  until_not()
方法的说明。

until(method,  message=″)
调用该方法提供的驱动程序作为一个参数,直到返回值为 True。

until_not(method,  message=″)
调用该方法提供的驱动程序作为一个参数,直到返回值为 False。

02-selenium的进一步学习(控制浏览器窗口+)_第1张图片

"""
*  presence_of_element_located()  方法判断元素是否存在
"""
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")

element = WebDriverWait(driver, 5, 0.5).until(
    EC.visibility_of_element_located((By.ID, "kw"))
    )
element.send_keys('selenium')
driver.quit()

这里需要学习一下预期判断条件搭配显性等待一起用

WebDriverWait(driver,  timeout,  poll_frequency=0.5,  ignored_exceptions=None)

    driver:浏览器驱动。
    timeout:最长超时时间,默认以秒为单位。
    poll_frequency:检测的间隔(步长)时间,默认为 0.5s。
    ignored_exceptions:超时后的异常信息,默认情况下抛出 NoSuchElementException
异常。

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
 WebDriverWait(driver, 5, 0.5)#设置最长时间为5秒,检测间隔为0.5s
element = WebDriverWait(driver, 5, 0.5).until(
    EC.visibility_of_element_located((By.ID, "kw"))
    )

普通等待(自定义元素等待)

"""
自定义元素等待
"""
from selenium import webdriver
from time import sleep, ctime

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")

print(ctime())
for i in range(10):
    try:
        el = driver.find_element_by_id("kw22")
        if el.is_displayed():
            break
    except:
        pass
    sleep(1)
else:
    print("time out")
print(ctime())

driver.quit()
from time import sleep
sleep(1)

隐式等待

"""
*  implicitly_wait() 隐式等待
"""
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from time import ctime

driver = webdriver.Firefox()

# 设置隐式等待为10秒
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")

try:
    print(ctime())
    driver.find_element_by_id("kw22").send_keys('selenium')
except NoSuchElementException as e:
    print(e)
finally:
    print(ctime())
    driver.quit()
"""
*  implicitly_wait() 隐式等待
"""
implicitly_wait()的参数是时间,单位为秒,本例中设置的等待时间为  10s。首先,这
10s 并非一个固定的等待时间,它并不影响脚本的执行速度。其次,它会等待页面上的所有
元素。当脚本执行到某个元素定位时,如果元素存在,则继续执行;如果定位不到元素,
则它将以轮询的方式不断地判断元素是否存在。假设在第 6s 定位到了元素,则继续执行,
若直到超出设置时间(10s)还没有定位到元素,则抛出异常。

 7、定位一组元素

WebDriver 还提供了 8 种用于定位一组元素的方法。

find_elements_by_id()
find_elements_by_name()
find_elements_by_class_name()
find_elements_by_tag_name()
find_elements_by_link_text()
find_elements_by_partial_link_text()
find_elements_by_xpath()
find_elements_by_css_selector()

定位一组元素的方法与定位单个元素的方法非常像,唯一的区别是单词“element”后
面多了一个“s”,用来表示复数。
"""
*  find_elements_xxx("xx")   定位一组元素
"""
from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get("https://www.baidu.cn")

driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
sleep(2)

# 定位一组元素
texts = driver.find_elements_by_xpath("//div[@tpl='se_com_default']/h3/a")

# 计算匹配结果个数
print(len(texts))

# 循环遍历出每一条搜索结果的标题
for t in texts:
    print(t.text)

driver.quit()
"""
*  find_elements_xxx("xx")   定位一组元素
"""

相比定位一个元素多了一个 s

8、多表单切换

在  Web  应用中经常会遇到  frame/iframe  表单嵌套页面的应用,WebDriver  只能在一个
页面上对元素进行识别和定位,无法直接定位  frame/iframe  表单内嵌页面上的元素,这时
就需要通过 switch_to.frame()方法将当前定位的主体切换为 frame/iframe 表单的内嵌页面。

在  Web  应用中经常会遇到  frame/iframe  表单嵌套页面的应用,WebDriver  只能在一个
页面上对元素进行识别和定位,无法直接定位  frame/iframe  表单内嵌页面上的元素,这时
就需要通过 switch_to.frame()方法将当前定位的主体切换为 frame/iframe 表单的内嵌页面。
"""
*  switch_to.frame()  进入表单
*  switch_to.default_content()  退出表单至根页面
"""
from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get("http://www.126.com")
sleep(2)

login_frame = driver.find_element_by_css_selector('iframe[id^="x-URS-iframe"]')
driver.switch_to.frame(login_frame)
driver.find_element_by_name("email").send_keys("username")
driver.find_element_by_name("password").send_keys("password")
driver.find_element_by_id("dologin").click()
driver.switch_to.default_content()

driver.quit()
"""
*  switch_to.frame()  进入表单
*  switch_to.default_content()  退出表单至根页面
"""

9、 多窗口切换

在页面操作过程中,有时单击某个链接会弹出新的窗口,这时就需要切换到新打开的
窗口中进行操作。WebDriver 提供的 switch_to.window()方法可以实现在不同的窗口间切换。
	current_window_handle:获得当前窗口句柄。
	window_handles:返回所有窗口的句柄到当前会话。
	switch_to.window():切换到相应的窗口。
"""
*  switch_to.window()  切换窗口
*  current_window_handle 获得当前窗口的句柄
*  window_handles:返回所有窗口的句柄到当前会话
"""
from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")

# 获得百度搜索窗口句柄
search_windows = driver.current_window_handle

driver.find_element_by_link_text('登录').click()
driver.find_element_by_link_text("立即注册").click()

# 获得当前所有打开的窗口的句柄
all_handles = driver.window_handles

# 进入注册窗口
for handle in all_handles:
    if handle != search_windows:
        driver.switch_to.window(handle)
        print(driver.title)
        driver.find_element_by_name("userName").send_keys('username')
        driver.find_element_by_name('phone').send_keys('138xxxxxxx')
        time.sleep(2)
        # ……
        # 关闭当前窗口
        driver.close()


# 回到搜索窗口
driver.switch_to.window(search_windows)
print(driver.title)

driver.quit()
"""
*  switch_to.window()  切换窗口
*  current_window_handle 获得当前窗口的句柄
*  window_handles:返回所有窗口的句柄到当前会话
"""

10、警告框处理

在 WebDriver 中处理 JavaScript 生成的 alert、confirm 和 prompt 十分简单,具体做法是,
首先使用  switch_to.alert()方法定位,然后使用  text、accept、dismiss、send_keys  等进行操
作。

	text:返回  alert、confirm、prompt  中的文字信息。
	accept():接受现有警告框。
	dismiss():解散现有警告框。
	send_keys():在警告框中输入文本(如果可以输入的话)。
可以使用 switch_to.alert()方法为百度搜索设置弹窗,如图 4-5 所示

02-selenium的进一步学习(控制浏览器窗口+)_第2张图片

"""
* text:返回 alert/confirm/prompt 中的文字信息。
* accept():接受现有警告框。
* dismiss():解散现有警告框。
* send_keys(keysToSend): 发送文本至警告框。
"""
from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')

# 打开搜索设置
link = driver.find_element_by_link_text('设置').click()
driver.find_element_by_link_text("搜索设置").click()
sleep(2)

# 保存设置
driver.find_element_by_class_name("prefpanelgo").click()

# 获得警告框
alert = driver.switch_to.alert

# 获得警告框提示信息
alert_text = alert.text
print(alert_text)

# 接受警告框
alert.accept()

driver.quit()
"""
* text:返回 alert/confirm/prompt 中的文字信息。
* accept():接受现有警告框。
* dismiss():解散现有警告框。
* send_keys(keysToSend): 发送文本至警告框。
"""

11、下拉框处理

下拉框是 Web 页面常见功能之一,WebDriver 提供了 Select 类来处理下拉框。
	Select 类:用于定位