【WebDriver API】用By定位元素&浏览器的简单操作

一、用By定位元素

WebDriver提供另一套书写方法,即统一调用find_element()方法,通过By来声明定位的方法,并且传入对应定位方法的定位参数。具体如下:

find_element(By.ID,"kw")
find_element(By.NAME,"wd")
find_element(By.CLASS_NAME,"s_ipt")
find_element(By.TAG_NAME,"input")
find_element(By.LINK_TEXT,"新闻")
find_element(By.PARTIAL_LINK_TEXT,"新")
find_element(By.XPATH,"//*[@class='s_ipt']")
find_element(By.CSS_SELECTOR,"span.s_ipt_wr>input#kw")

find_element()方法只用于定位元素。它需要两个参数,第一个参数是定位的类型,有By提供:第二个参数是定位的具体方式。在使用By之前需要将By类导入。

from selenium.webdriver.common.by import By

二、控制浏览器

1.控制浏览器窗口大小

例如移动端大小为480*800,然后访问移动站点,WebDriver提供了set_window_size()方法来设置浏览器的大小。

from selenium import webdriver
driver=webdriver.Firefox()
driver.get("http://m.mail.10086.cn")
#参数数字为像素点
print("设置浏览器宽480、高800显示")
driver.set_window_size(480,800)
driver.quit()
在PC端执行自动化测试脚本大多的情况下是希望浏览器在全屏幕模式下执行,那么可以使用maximize_window()方法使打开的浏览器全屏显示,其用法与set_window_size相同,但它不需要参数。
from selenium import webdriver
driver=webdriver.Firefox()
driver.get("http://m.mail.10086.cn")
print("设置全屏显示")
driver.maximize_window()
driver.quit()

2、控制浏览器后退、前进

在使用浏览器浏览网页时,浏览器提供了后退和前进按钮,可以方便地浏览过的网页之间的切换,WebDriver也提供了对应的back()和forward()方法来模拟后退和前进按钮。

from selenium import webdriver

driver=webdriver.Firefox()

#访问百度首页
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()

输出结果为:

now access http://www.baidu.com
now access http://news.baidu.com
Back to http://www.baidu.com
forward to http://news.baidu.com

3、模拟浏览器刷新

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

三、简单元素登陆

认识WebDriver中最常用的几个方法:

  • clear():清除文本
  • send_keys(*value):模拟按键输入
  • click():单击元素

例子:CSDN登陆

from selenium import webdriver
from time import sleep

driver=webdriver.Chrome()
driver.get("https://www.csdn.net")

driver.find_element_by_class_name("userinfo").click()

driver.find_element_by_link_text("账号登录").click()

driver.find_element_by_id("all").clear()
driver.find_element_by_id("all").send_keys("username")
driver.find_element_by_id("password-number").clear()
driver.find_element_by_id("password-number").send_keys("password")
driver.find_element_by_class_name("btn").click()
sleep(3)
driver.quit()
clear()方法用于清除文本输入框中的内容。例如,登陆框内一般默认会有“账号”“密码”等提示信息,用于引导用户输入正确的数据;但如果直接向输入框中输入数据,则可能会与输入框中的提示信息拼接。例如,本来用户输入的是"username",但与提示信息拼接则变为"账号username",从而造成输入信息错误。这个时候可以先使用clear()方法来清除输入框中的默认提示信息。
send_keys()方法模拟健盘向输入框里输入内容。如上面的例子中,通过这个方法向用户名和密码框中输入登陆信息。当然,他的作用不仅于此,我们还可以用它发送键盘按键,甚至用它来模拟文件上传。
click()方法可以用来单击一个元素,前提是它是可以被单击的对象,它与send_keys()方法是Web页面操作中最常用到的两个方法。其实click()方法不仅可用于单击一个按钮,它还能单击任何可以单击的文字/图片链接、复选框、单选框、下拉框等。

四、WebElement接口常用方法

通常有趣的和需要与页面交互的方法都由WebElement接口提供。WebElement还提供了一些非常有用的方法,下面我们就来学习这些方法的使用。

1、submit()

submit()方法用于提交表单。例如,在搜索框输入关键字之后的“回车”操作,就可以通过submit()方法模拟。

# coding = utf-8
from time import sleep
from selenium import webdriver

driver = webdriver.Firefox()
driver.get("http://www.youdao.com")
driver.find_element_by_id('translateContent').send_keys("hello")
#提交输入框的内容
driver.find_element_by_id('hnwBtn').submit()
sleep(3)
driver.quit()
上面的例子,我们通过定位有道搜索框并通过submit()提交搜索框的内容,同样达到单击“搜索”按钮的效果。有时候submit()可以与click()方法互换使用,submit()同样可以提交一个按钮,但submit()的应用范围远不及click()方法广泛。
  • size:返回元素的尺寸。
  • text:获取元素文本。
  • get_attribute(name):获得属性值。
  • is_displayed():设置该元素是否用户可见。
from selenium import webdriver

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

#获得输入框的尺寸
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)

输入结果

==================================================================================

{'width': 500, 'height': 22}
©2019 Baidu 使用百度前必读 意见反馈 京ICP证030173号  京公网安备11000002000001号 
text
True

-------------------------------------------------------------------------------------------------------------------------------------------------

执行上面的程序并查看结果:size方法用于获取百度输入框的宽、高,text方法用于获得百度底部的备案信息,get_attribute()用于获得百度输入的type属性的值,is_displayed用于返回一个元素是否可见,如果可见则返回True,否则返回False。

当然还提供了其他方法,读者可以参考WebDriver API官方文档学习。

2、鼠标事件

鼠标的右击、双击、悬停、甚至鼠标拖动等功能。在WebDriver中,将这些关于鼠标操作的方法封装在ActionChains类提供。

ActionChains类提供了鼠标操作的常用方法:

  • perform():执行所有ActionChains中存储的行为
  • context_click:右击
  • double_click:双击
  • drag_and_drop():拖动
  • move_to_element():鼠标悬停

由CSDN右键快捷菜单功能,如下图。

鼠标右击操作

对于ActionChains类所提供的鼠标方法与前面学过的click()方法的用法有所不同,例子如下:

from selenium import webdriver
#引入ActionChains类
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Firefox()
driver.get("http://www.CSDN.net")
#定位到要右击的元素
right_click=driver.find_element_by_link_text("区块链")
#对定位到的元素执行鼠标右键操作
ActionChains(driver).context_click(right_click).perform()

---------------------------------------------------------------------------------------------------------

  • from selenium.webdriver.common.action_chains import ActionChains--导入提供鼠标操作的ActionChains类。
  • ActionChains(driver)--调用ActionChains()类,将浏览器驱动driver作为参数传入。
  • context_click()--方法用于模拟鼠标右键操作,在调用时需要制定元素定位。
  • perform()--执行所有ActionChains中存储的行为,可以理解成是对整个操作的提交动作。

鼠标悬停

鼠标悬停弹出下拉菜单也是一个十分常见的功能设计。

move_to_element()方法可以模拟鼠标悬停的动作,其用法与context_click()相同。

from selenium import webdriver
#引入ActionChains类
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
#定位到需要悬停的元素
above=driver.find_element_by_link_text("设置")
#对定位到的元素执行鼠标悬停操作
ActionChains(driver).move_to_element(above).perform()

---------------------------------------------------------------------

鼠标双击操作

double_click方法用于模拟鼠标双击操作。

from selenium import webdriver
#引入ActionChains类
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Firefox()
driver.get("http://www.CSDN.net")
#定位要悬停的元素
double_click=driver.find_element_by_id("remind")
#对定位到的元素执行鼠标双击操作
ActionChains(driver).double_click(double_click).perform()

鼠标拖放操作

drag_and_drop(source,target)在源元素上按住鼠标左键,然后移动到目标元素上释放。

  • source:鼠标拖动的源元素
  • target:鼠标释放的目标元素
#定位元素的位置
element=driver.find_element_by_id("xx")
#定位元素要移动的目标位置
target=driver.find_element_by_id("xx")
#执行元素的拖放操作
ActionChains(driver).drag_and_drop(element,target).perform()

键盘事件

Keys()类提供了键盘上几乎所有按键的方法。前面了解到,send_keys()方法可以用来模拟键盘输入,除此之外,我们还可以用它来输入键盘上的按键,甚至是组合键,如Ctrl+A、Ctrl+C等。

# coding = utf-8
from time import sleep
from selenium import webdriver
#引入Keys类
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
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)
sleep(3)
#输入空格键+"教程"
driver.find_element_by_id("kw").send_keys(Keys.SPACE)
driver.find_element_by_id("kw").send_keys("教程")
sleep(3)
#ctrl+a全选输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
sleep(3)
#ctrl+x剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,"x")
sleep(3)
#ctrl+v粘贴内容到输入框
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'v')
sleep(3)
#通过回车键来代替单击操作
driver.find_element_by_id("su").send_keys(Keys.ENTER)
sleep(3)
driver.quit()

from selenium.webdriver.common.keys import Keys

在使用键盘按键方法前需要先导入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

获得验证信息

在编写功能测试用例时,会假定一个预期结果,在执行用例的过程中把得到的实际结果与预期结果进行比较,从而判断用户的通过或失败。自动测试用例是机器去执行的,通常机器并不像人一样有思维和判断能力,那么是不是模拟各种操作页面的动作没有报错就说明用例执行成功呢?并非如此,例如我们模拟百度搜索的用例,当新的迭代版本上线后,每一页的搜索结果少一条,但用例的执行不会报错,因此这个bug永远不会被自动化测试发现。

那么是不是在运行自动化测试用例时需要由测试人员盯着用例的执行来辨别执行结果呢?如果是这样的话,自动化测试就失去了“自动化”的意义。在自动化用例执行完成之后,我们可以从页面上获取一些信息来“证明”用例执行是成功还是失败。

通常用的最多的几种验证信息分别是title、URL、和text。text方法在前面已经讲过,它用于获取标签之间的文本信息。

from time import sleep
from selenium import webdriver

driver=webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.51zxw.net/")

print('Before login===========================================================')
#打印当前页面title
title=driver.title
print(title)

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

driver.maximize_window()
driver.find_element_by_xpath("/html/body/div[1]/div/div[1]/div[2]/a").click()
driver.find_element_by_xpath('//*[@id="loginStr"]').send_keys('w68688686')
driver.find_element_by_xpath('//*[@id="pwd"]').send_keys("*******")
driver.find_element_by_xpath('//*[@id="loginFrom"]/div/div[5]/button').click()
sleep(5)
print('After login=============================================================')
#再次打印当前页面title
title=driver.title
print(title)

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

#获得登陆的用户名
user=driver.find_element_by_xpath('/html/body/div[1]/div/div[1]/div[2]/span').text
print(user)

driver.quit()

输出结果:

Before login===========================================================
我要自学网-视频教程|免费教程|自学电脑|3D教程|平面教程|影视动画教程|办公教程|机械设计教程|网站设计教程-我要自学网
https://www.51zxw.net/
After login=============================================================
我要自学网-视频教程|免费教程|自学电脑|3D教程|平面教程|影视动画教程|办公教程|机械设计教程|网站设计教程-我要自学网
https://www.51zxw.net/
w68688686

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

current_url:用户获得当前页面的URL。

通过打印结果,我们发现登陆前后的title与URL相同,无法明确那个用户登陆成功,因此通过text获得用户文本w68688686是很好的验证信息。

发布了23 篇原创文章 · 获赞 6 · 访问量 4757

猜你喜欢

转载自blog.csdn.net/w68688686/article/details/103556694