selenium笔记

2023-11-10

爬取

1:

coding=utf-8**
from selenium import webdriver
browser = webdriver.Firefox()
browser.get("http://www.baidu.com")#获得浏览器对象后,通过 get()方法,可以向浏览器发送网址
browser.find_element_by_id("kw").send_keys("selenium")#元素定位,input的id是kw。关于页面元素的定位后面将会详细的介绍,这里通过 id=kw 定位到百度的输入框,并通过键盘方法* *
browser.find_element_by_id("su").click() #单击按钮id为su
browser.quit() #退出并关闭窗口的每一个相关的驱动程序

2:

#coding=utf-8**
from selenium import webdriver
driver=webdriver.Firefox()
'''
driver.get("http://www.baidu.com")
#参数数字为像素点
print "设置浏览情宽480,高800显示"
driver.set_window_size(480,800)
'''
'''
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.quit()

第 三 章 python webdriver API

准备

  1. 安装seleniumm
pip install selenium

\2. 下载浏览器驱动

Firefox浏览器驱动:geckodriver

Chrome浏览器驱动:chromedriver , taobao备用地址

IE浏览器驱动:IEDriverServer

Edge浏览器驱动:MicrosoftWebDriver

Opera浏览器驱动:operadriver

PhantomJS浏览器驱动:phantomjs

需要把浏览器驱动放入系统路径中,或者直接告知selenuim的驱动路径

可以测试是否正常使用,以下代码:

用from selenium import webdriver
driver = webdriver.Firefox()   # Firefox浏览器
# driver = webdriver.Firefox("驱动路径")
driver = webdriver.Chrome()    # Chrome浏览器
driver = webdriver.Ie()        # Internet Explorer浏览器
driver = webdriver.Edge()      # Edge浏览器
driver = webdriver.Opera()     # Opera浏览器
driver = webdriver.PhantomJS()   # PhantomJS

定位:

find_element_by_id()
find_element_by_name()
find_element_by_class_name()
find_element_by_tag_name()
find_element_by_link_text()
find_element_by_partial_link_text()
find_element_by_xpath()
find_element_by_css_selector()

在element变成elements就是找所有满足的条件,返回数组。

WebElement 接口的其它更多方法请参考 webdriver API

#coding=utf-8*
from selenium import webdriver
driver = webdriver.Firefox()
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
attribute=driver.find_element_by_id("kw").get_attribute(*'type')
print attribute
result=driver.find_element_by_id("kw").is_displayed()
print result
#通过 submit() 来提交操作
#driver.find_element_by_id("dl_an_submit").submit()
**driver.quit()

第四节:鼠标事件

鼠标操作

在 WebDriver 中, 将这些关于鼠标操作的方法封装在 ActionChains 类提供。

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

  • perform(): 执行所有 ActionChains 中存储的行为;

  • context_click(): 右击;

  • double_click(): 双击;

  • drag_and_drop(): 拖动;

  • move_to_element(): 鼠标悬停。

  • click_and_hold() 按下鼠标左键在一个元素上

举个例子:

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

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

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

1都要先引入包,ActionChains 用于生成用户的行为;所有的行为都存储在 actionchains 对象。通过 perform()执行存储的行为。

2双击,悬停,按下鼠标左键:right变成double,left,above

3拖动

#定位元素的原位置

element = driver.find_element_by_name(“xxx”)

#定位元素要移动到的目标位置

target = driver.find_element_by_name(“xxx”)

#执行元素的移动操作

ActionChains(driver).drag_and_drop(element, target).perform()

键盘事件

以下为常用的键盘操作:

  • 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
# 输入框输入内容
driver.find_element_by_id("kw").send_keys("seleniumm")

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

2

#coding=utf-8*
from selenium import webdriver
#引入 Keys 类包
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
#输入框输入内容
driver.find_element_by_id(*"kw").send_keys("selenium")
time.sleep(3)
#删除多输入的一个 m
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
time.sleep(3)
#输入空格键+“教程”
driver.find_element_by_id("kw").send_keys(Keys.SPACE)
driver.find_element_by_id("kw").send_keys(u"教程")
time.sleep(3)
#ctrl+a 全选输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
time.sleep(3)
#ctrl+x 剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
time.sleep(3)
#输入框重新输入内容,搜索
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'v')
time.sleep(3)
#通过回车键盘来代替点击操作
driver.find_element_by_id("su").send_keys(Keys.ENTER)
#回退
driver.find_element_by_id("su").send_keys(Keys.ESCAPE)
#制表键
driver.find_element_by_id("su").send_keys(Keys.TAB)
time.sleep(3)
driver.quit()

打印信息

#获得前面 title,打印

title = driver.title

print title

#拿当前 URL 与预期 URL 做比较

if title == u"快播私有云":

print “title ok!”

else:

print “title on!”

#获得前面 URL,打印

now_url = driver.current_url

print now_url

#拿当前 URL 与预期 URL 做比较

if now_url == “http://webcloud.kuaibo.com/”:

print “url ok!”

else:

print “url on!”

#获得登录成功的用户,打印

now_user=driver.find_element_by_xpath("//div[@id=‘Nav’]/ul/li[4]/a[1]/span").text

print now_user

第七节 设置等待时间(页面加载

  • 显示等待

显式等待使WebdDriver等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常(TimeoutException)。

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.Firefox()
driver.get("http://www.baidu.com")

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

WebDriverWait类是由WebDirver 提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。具体格式如下:

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。

在本例中,通过as关键字将expected_conditions 重命名为EC,并调用presence_of_element_located()方法判断元素是否存在。

  • 隐式等待

如果某些元素不是立即可用的,隐式等待是告诉WebDriver去等待一定的时间后去查找元素。 默认等待时间是0秒,一旦设置该值,隐式等待是设置该WebDriver的实例的生命周期。

from selenium import webdriver
driver = webdriver.Firefox()    
driver.implicitly_wait(10) # seconds    
driver.get("http://somedomain/url_that_delays_loading")    
myDynamicElement = driver.find_element_by_id("myDynamicElement") 

sleep():设置固定休眠时间。python 的 time 包提供了休眠方法 sleep() ,导入 time包后就可以使用 sleep()

进行脚本的执行过程进行休眠。

implicitly_wait():是 webdirver 提供的一个超时等待。隐的等待一个元素被发现,或一个命令完成。

如果超出了设置时间的则抛出异常。

WebDriverWait():同样也是 webdirver 提供的方法。在设置时间内,默认每隔一段时间检测一次当前

页面元素是否存在,如果超过设置时间检测不到则抛出异常。

#coding=utf-8*
from selenium import webdriver
#导入 WebDriverWait 包
from selenium.webdriver.support.ui import WebDriverWait
#导入 time 包
import time
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
#WebDriverWait()方法使用
element=WebDriverWait(driver, 10).until(lambda driver :
driver.find_element_by_id(*"kw"))
element.send_keys("selenium")
#添加智能等待
driver.implicitly_wait(30)
driver.find_element_by_id("su").click()
#添加固定休眠时间
time.sleep(5)
driver.quit()

 

#coding=utf-8**
import time
#sleep()方法以秒为单位,假如休眠时间小时 1 秒,可以用小数表示。
time.sleep(5)
time.sleep(0.5)
#当然,也可以直接导入 sleep()方法,使脚本中的引用更简单
from time import sleep
sleep(3)
sleep(30)
mplicitly_wait()
implicitly_wait()方法比 sleep() 更加智能,后者只能选择一个固定的时间的等待,前者可以在一个时间
范围内智能的等待。
WebDriverWait()
详细格式如下:
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
driver - WebDriver 的驱动程序(Ie, Firefox, Chrome 或远程)
timeout - 最长超时时间,默认以秒为单位
poll_frequency - 休眠时间的间隔(步长)时间,默认为 0.5 秒
 ignored_exceptions - 超时后的异常信息,默认情况下抛 NoSuchElementException 异常。
WebDriverWai()一般由 unit()或 until_not()方法配合使用,直到until为ture或者not until为false
from selenium.webdriver.support.ui import WebDriverWait
element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id(“someId”))
is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).
until_not(lambda** x: x.find_element_by_id(“someId”).is_displayed())

第八节 定位一组对象

#coding=utf-8*
from selenium import webdriver
import  os
driver=webdriver.Firefox()
file_path='file:///'+os.path.abspath('1.html')
driver.get(file_path)
#选择页面上多有tagname为input的元素
inputs=driver.find_elements_by_tag_name('input')
for input in inputs:
  if input.get_attribute('type')==*'checkbox':
    input.click()
    print "11"**
driver.quit()
os.path.abspath()
os 模块为 python 语言标准库中的 os 模块包含普遍的操作系统功能。主要用于操作本地目录文件。
path.abspath()方法用于获取当前路径下的文件。另外脚本中还使用到 for 循环,对 inputs 获取的一组元素
进行循环,在 python 语言中循环变量(input)可以不用事先声明直接使用

打印当前页面上 type 为 checkbox 的个数,# 选择所有的 type 为 checkbox 的元素并单击勾选**

print len(driver.find_elements_by_css_selector('input[type=checkbox]'))
# 把页面上最后1个 checkbox 的勾给去掉
driver.find_elements_by_css_selector('input[type=checkbox]').pop().click()

pop 也为 python 语言中提供的方法,用于删除指定们位置的元素,pop()为空默认选择最一个元素。

第九节 层级定位

#点击link1链接(弹出下拉列表)*
driver.find_element_by_link_text('Link1').click()
#在父亲元件下找到link为action的子元素
menu=driver.find_element_by_id(*'dropdown1').find_element_by_link_text('Another action')
#鼠标移动到子元素上面
ActionChains(driver).move_to_element(menu).perform()
driver.find_element_by_id('xx').find_element_by_link_text('xx').click()

这里用到了二次定位,通过对 Link1 的单击之后,出现下拉菜单,先定位到下拉菜单,再定位下拉菜单中的选项。当然,如果菜单选项需要单击,可通过二次定位后也直接跟 click()操作。
ActionChains(driver)
driver: wedriver 实例执行用户操作。

ActionChains 用于生成用户的行为;所有的行为都存储在 actionchains 对象。通过 perform()执行存储的行为。
move_to_element(menu)
move_to_element 方法模式鼠标移动到一个元素上,上面的例子中 menu 已经定义了他所指向的是哪一个元素。
perform() 执行所有 ActionChains 中存储的行为

第十节 定位 frame**中的对象

#先找到到 ifrome1(id = f1)**
driver.switch_to_frame("f1")
#再找到其下面的 ifrome2(id =f2)
driver.switch_to_frame("f2"**)

switch_to_frame 的参数问题。官方说 name 是可以的,但是经过实验发现 id 也可以。所以只要 frame

中 id 和 name,那么处理起来是比较容易的。如果 frame 没有这两个属性的话,你可以直接手动添加

第十一节 对话框处理

页面上弹出的对话框是自动化测试经常会

#点击登录链接
driver.find_element_by_name("tj_login").click()

#通过二次定位找到用户名输入框
div=driver.find_element_by_class_name("tang-content").find_element_by_name("userName")
div.send_keys("username")

#输入登录密码
driver.find_element_by_name("password").send_keys("password")

#点击登录
driver.find_element_by_id("TANGRAMPSP_10submit").click()本例中并没有用到新方法,唯一的技巧是用到了二次定位,这个技巧在层级定位中已经有过使用。
driver.find_element_by_class_name("tang-content").find_element_by_name("userName")
第一次定位找到弹出的登录框,在登录框上再次进行定位找到了用户名输入框。

第十二节 浏览器多窗口处理

  • 控制浏览器窗口大小
driver.set_window_size(480, 800)
  • 浏览器后退,前进
# 后退 driver.back() # 前进 driver.forward()
  • 刷新
driver.refresh() # 刷新

关闭浏览器

  • close() 关闭单个窗口
  • quit() 关闭所有窗口

2

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

driver = webdriver.Firefox()
driver.get("http://www.baidu.com/")
# 获得当前窗口**
nowhandle = driver.current_window_handle
# 打开注册新窗口
driver.find_element_by_name("tj_reg").click()
# 获得所有窗口
allhandles = driver.window_handles
# 循环判断窗口是否为当前窗口
for handle in allhandles:
  if handle != nowhandle:
    driver.switch_to_window(handle)
print 'now register window!'**
# 切换到邮箱注册标签
driver.find_element_by_id("mailRegTab").click()
time.sleep(5)
driver.close()
# 回到原先的窗口
driver.switch_to_window(nowhandle)
driver.find_element_by_id("kw").send_keys(u"注册成功!")
time.sleep(3)
driver.quit()

在本例中所有用到的新方法:
current_window_handle
获得当前窗口句柄
window_handles
返回的所有窗口的句柄到当前会话
switch_to_window()
用于处理多窗口操作的方法,与我们前面学过的 switch_to_frame() 是类似,switch_to_window()用于
处理多窗口之前切换,switch_to_frame() 用于处理多框架的切换。
close()
如果你足够细心会发现我们在关闭“注册页”时用的是 close()方法,而非 quit();close()用于关闭当前
窗口,quit()用于退出驱动程序并关闭所有相关窗口。

第十二节 alert/confirm/prompt

webdriver 中处理 JavaScript 所生成的 alert、confirm 以及 prompt 是很简单的。具体思路是使用switch_to.alert()方法定位到 alert/confirm/prompt。然后使用 text/accept/dismiss/send_keys 按需进行操做。

l text 返回 alert/confirm/prompt 中的文字信息。

l accept 点击确认按钮。

l dismiss 点击取消按钮,如果有的话。

l send_keys 输入值,这个 alert\confirm 没有对话框就不能用了,不然会报错

#点击保存设置
driver.find_element_by_xpath("//div[@id='gxszButton']/input").click()
#接受警告信息
alert = driver.switch_to_alert()
alert.accept()
#得到文本信息并打印
alert = driver.switch_to_alert()
print alert.text()
#取消对话框(如果有的话)
alert = driver.switch_to_alert()
alert.dismiss()
#输入值(如果有的话)
alert = driver.switch_to_alert()
alert.send_keys(“xxx”)

第十三节 下拉框处理

from selenium import webdriver
from selenium.webdriver.support.select import Select
from time import sleep

driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('http://www.baidu.com')
sel = driver.find_element_by_xpath("//select[@id='nr']")
Select(sel).select_by_value('50')  # 显示50条

#先定位到下拉框

m=driver.find_element_by_id(“ShippingMethod”)

#再点击下拉框下的选项

m.find_element_by_xpath("//option[@value=‘10.69’]").click()

需要说明的是在实际的 web 测试时,会发现各种类型的下拉框,并非我们我们上面所介绍的传统的下拉框。如图 3.x ,对这种类型的下拉框一般的处理是两次点击,第一点击弹出下拉框,第二次点击操作元素。当然,也有些下拉框是鼠标移上去直接弹出的,那么我们可以使用 move_to_element()进行操作。

第十四节 分页处理

#获取所有分页的数量,并打印
total_pages=len(driver.find_element_by_tag_name("select").find_elements_by_t
ag_name("option"))
print "total page is %s" %(total_pages)
sleep(3)

#再次获取所分页,并执行循环翻页操作
pages=driver.find_element_by_tag_name("select").find_elements_by_tag_name("option")

for page in pages:
	page.click()

第十五节 上传文件

#打开上传文件页面
file_path = 'file:///' + os.path.abspath('upload_file.html')
driver.get(file_path)

#定位上传按钮,添加本地文件
driver.find_element_by_name("file").send_keys('D:\selenium_use_case\upload_file.txt')

第十六节 下载文件

browser.download.dir 用于指定你所下载文件的目录。

os.getcwd() 该函数不需要传递参数,用于返回当前的目录。

application/octet-stream 为内容的类型

第十七节 调用 JavaScript

webdriver 提供了 execute_script() 接口用来调用 js 代码。

如果你熟悉 JavaScript的话,那么使用 webdriver 执行 JavaScript 是一件非常高效的事情。

#######通过 JS 隐藏选中的元素##########第一种方法:

#隐藏文字信息

driver.execute_script(’$("#tooltip").fadeOut();’)

time.sleep(5)

#隐藏按钮:

button = driver.find_element_by_class_name(‘btn’)

driver.execute_script(’$(arguments[0]).fadeOut()’,button)

execute_script(script, *args)

在当前窗口/框架 同步执行 javaScript

script:JavaScript 的执行。

*args:适用任何 JavaScript 脚本。

第十八节、控制浏览器滚动条

#将页面滚动条拖到底部

js=“var q=document.documentElement.scrollTop=10000”

driver.execute_script(js)

time.sleep(3)

#将滚动条移动到页面的顶部

js_=“var q=document.documentElement.scrollTop=0”

driver.execute_script(js_)

第十九节 cookie操作处理

cookie操作

WebDriver操作cookie的方法:

  • get_cookies(): 获得所有cookie信息。
  • get_cookie(name): 返回字典的key为“name”的cookie信息。
  • add_cookie(cookie_dict) : 添加cookie。“cookie_dict”指字典对象,必须有name 和value 值。
  • delete_cookie(name,optionsString):删除cookie信息。“name”是要删除的cookie的名称,“optionsString”是该cookie的选项,目前支持的选项包括“路径”,“域”。
  • delete_all_cookies(): 删除所有cookie信息

直接用cookie登录方法

链接:https://www.jianshu.com/p/773c58406bdb

  1. 手动获取网页的cookie,将其序列化并存储在本地
  2. 写入代码
for item in cookies:
    driver.add_cookie(item)

获得 cookie 信息**

对cookie操作:

#向 cookie 的 name 和 value 添加会话信息。

driver.add_cookie({‘name’:‘key-aaaaaaa’, ‘value’:‘value-bbbb’})

#遍历 cookies 中的 name 和 value 信息打印,当然还有上面添加的信息

for cookie in driver.get_cookies():

print “%s -> %s” % (cookie[‘name’], cookie[‘value’])

下面可以通过两种方式删除 cookie

删除一个特定的 cookie

driver.delete_cookie(“CookieName”)

删除所有 cookie

driver.delete_all_cookies()

第二十节 获取对象的属性

input.get_attribute(‘data-node’) == ‘594434493’:

第二十一节 验证码问题

1去掉验证码2设置万能码3验证码识别技术:Python-tesseract 是光学字符识别 Tesseract OCR 引擎的 Python 封装类。能够读取任何常规的图片文件(JPG, GIF ,PNG , TIFF 等)。不过,目前市面上的验证码形式繁多,目前任何一种验证码识别技术,识别率都不是 100% 。

4记录 cookie

通过向浏览器中添加 cookie 可以绕过登录的验证码,这是比较有意思的一种解决方案。我们可以在用户登录之前,通过 add_cookie()方法将用户名密码写入浏览器 cookie ,再次访问系统登录链接将自动登录。例如下面的方式:

#访问 xxxx 网站

driver.get(“http://www.xxxx.cn/”)

#将用户名密码写入浏览器 cookie

driver.add_cookie({‘name’:‘Login_UserNumber’, ‘value’:‘username’})

driver.add_cookie({‘name’:‘Login_Passwd’, ‘value’:‘password’})

#再次访问 xxxx 网站,将会自动登录

driver.get(“http://www.xxxx.cn/”)

time.sleep(3)

使用 cookie 进行登录最大的难点是如何获得用户名密码的 name ,如果找到不到 name 的名字,就没办法向 value 中输用户名、密码信息。笔者的建议是可以通过 get_cookies()方法来获取登录的所有的 cookie 信息,从而进行找到用户名、密码的 name 对象的名字;当然,最简单的方法还是询问前端开发人员。

第二十二节 weddriver**原理

\1. WebDriver 启动目标浏览器,并绑定到指定端口。该启动的浏览器实例,做为 web driver 的 remote server。

\2. Client 端通过 CommandExcuter 发送 HTTPRequest 给 remote server 的侦听端口(通信协议: the webriver wire protocol)

\3. Remote server 需要依赖原生的浏览器组件(如:IEDriverServer.exe、chromedriver.exe),来转化转化浏览器的 native 调用。

总结:

通过本章的学习,我们比较全面的掌握了如何使用 webdriver 所提供的方法对页面上各种元素进行操作。不过在实际的自动化测试过程中,读者会遇到各种各样的问题,笔者建议读者从以下几个方面进行提高:

1、熟练掌握 xpath\CSS 定位的使用,这样在遇到各种难以定位的属性时才不会变得束手策。

2、准备一份 python 版本的 webdriver API ,遇到不理解地方,及时查到 API 的使用

3、学习掌握 JavaScript 语言,掌握 JavaScript 好处前面已经有过阐述,可以让我们的自动化测试工作更加游刃有余。

4、自动化测试归根结底是与前端打交道,多多熟悉前端技术,如 http 请求,HTML 语言 ,cookie/session 机制等。

其他##################

在element变成elements就是找所有满足的条件,返回数组。

Webelement常用方法

  • 点击和输入
driver.find_element_by_id("kw").clear() # 清楚文本 driver.find_element_by_id("kw").send_keys("selenium") # 模拟按键输入 driver.find_element_by_id("su").click() # 单机元素
  • 提交

可以在搜索框模拟回车操作

search_text = driver.find_element_by_id('kw') search_text.send_keys('selenium') search_text.submit()
  • 其他

size: 返回元素的尺寸。

text: 获取元素的文本。

get_attribute(name): 获得属性值。

is_displayed(): 设置该元素是否用户可见。

获取断言信息

title = driver.title # 打印当前页面title
now_url = driver.current_url # 打印当前页面URL
user = driver.find_element_by_class_name('nums').text # # 获取结果数目

在不同的窗口和框架之间移动

driver.switch_to_window("windowName")
driver.switch_to_frame("frameName")

以直接取表单的id 或name属性。如果iframe没有可用的id和name属性,则可以通过下面的方式进行定位。

#先通过xpth定位到iframe
xf = driver.find_element_by_xpath('//*[@id="x-URS-iframe"]')

#再将定位对象传给switch_to_frame()方法
driver.switch_to_frame(xf)

一旦我们完成了frame中的工作,我们可以这样返回父frame:

driver.switch_to_default_content()

警告框处理

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

文件上传

driver.find_element_by_name("file").send_keys('D:\\upload_file.txt')  # # 定位上传按钮,添加本地文件

调用JavaScript代码

js="window.scrollTo(100,450);"
driver.execute_script(js) # 通过javascript设置浏览器窗口的滚动条位置

通过execute_script()方法执行JavaScripts代码来移动滚动条的位置。

窗口截图

driver.get_screenshot_as_file("D:\\baidu_img.jpg") # 截取当前窗口,并指定截图图片的保存位置

第 四 章 自动化测试模型

自动化测试模型介绍

4.1.1 线性测试

4.1.2 模块化与类库:

把重复的部分写成一个公共的模块,需要的时候进行调用,

login.py

#登录模块

def login():

driver.find_element_by_id(“tbUserName”).send_keys(“username”)

driver.find_element_by_id(“tbPassword”).send_keys(“456123”)

driver.find_element_by_id(“btnLogin”).click()

调用login.login()

4.1.3 数据驱动

4.1.4 关键字驱动

第一节、 登录模块化

第三节、数据驱动(参数化)

source=open(“D:abc**data.txt”,“r”)
values=source.readlines(); // un = source.read() #读取用户名
source.close()

for a invalues:

​ driver.find_element_by_id(“kw”).send_keys(a)

通过 python 文档我们发现 python

读取文件的方式有:整个文件读取、逐行读取、固定字节读取。并没有找到一次读取两条数据的好方法

q.py

def fun(un=‘testing’, pw=123456):
print “success reader username and password!!”*

  • return un, pw

import q # 导入函数**

通过两个变量,来接收调用函数获得用户名&密码

创建字典用大括号,数据由 key/value 键值对组成,keys()方法返回字典中的键列表。values()返回字典中的值列表,items()返回(key,value)元组

CSV 读取文件比较灵活,可以循环读取每一条数据,从而又不局限每次所读取数据的个数。

第五章 自动化测试用例设计

encoding:utf-8**

抛出异常

#coding=utf-8**
filename=raw_input(“please input a valueL:”)
if filename==“hello”:
raise NameError(‘indfput file name error’**)

第 四 节、weddriver 错误截图

browser.get_screenshot_as_file(“F:/Projects/python/516/error_png.png”)

在脚本无法继续执行时候, get_screenshot_as_file()函数将截取当前页面的截图保存到指定的位置,这是一个非常棒的功能

自动化测试用 例
引入 unittest 单元测试框架

简略版参考:https://zhuanlan.zhihu.com/p/111859925

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

selenium笔记 的相关文章

随机推荐

  • 新版Spring Boot(10)- Spring Boot 整合数据持久层(1)

    1 整合JdbcTemplate Service Description TODO Author tzb Date 2021 8 22 10 23 Version 1 0 Service public class UserService A
  • 【Mysql】删除表记录,并限制条数

    删除表数据 好删 那如果要限制条数 如何删除呢 例如 有个表tag list 我要删除aid为6666的前100条数据 sql如下 删除表记录limit限制条数 delete from tag list where aid 6666 lim
  • JUC 六. 线程中断 与 LockSupport

    目录 一 基础理解 如何退出一个线程 volatile 与 AtomicBoolean 中断线程示例 Thread中自带的中断api示例 阻塞状态线程中断时异常解决 二 Thread中自带的中断底层分析 三 总结 一 基础理解 先了解几个问
  • 打印九九口诀表(pta练习题)

    下面是一个完整的下三角九九口诀表 本题要求对任意给定的一位正整数N 输出从1 1到N N的部分口诀表 输入格式 输入在一行中给出一个正整数N 1 N 9 输出格式 输出下三角N N部分口诀表 其中等号右边数字占4位 左对齐 include
  • AIDL原理和相关文件解析

    Binder概述 相信从事Android相关的研发人员 都对Binder有个或多或少的了解 相关技术博客也有一大推 我今天对Binder的学习过程进行一个记录 理论性的叙述会少一点 更多的是基于AS自动生成的AIDL文件进行代码分析 但读者
  • 【Java基础】使用Java 8的Stream API来简化Map集合的操作

    在 Java 8 中引入的 Stream API 是一种非常强大的函数式编程工具 可以帮助开发者更加方便地对集合进行操作和处理 而在 Map 集合中 Stream API 的使用也能够极大地简化代码 并提升程序效率和可读性 在本文中 我们将
  • 网络基础通过子网掩码 计算主机数网络范围

    192 168 11 16 27 主机的个数为32 27 5 2 5 32 32 2 30主机数为30 主机范围是0 31 63 95 必须是32的倍数 16在0 32之间 31是广播地址 网络号是192 168 11 0
  • 白话学习防火墙3 之防火墙工作模式(适用于IPS、IDS、WAF等其他安全设备)

    说白了 透明模式就是当交换机使 路由模式就是当路由使 混杂就是杂交物种 即当作路由使 又当作交换机使 透明模式 透明模式一般用于网络建设完 网络功能基本已经实现的情况下 用户需要加装防火墙以实现安全区域隔离的要求 早期也称之为桥模式 桥这个
  • jvm的内存模型之eden区

    浅谈java内存模型 不同的平台 内存模型是不一样的 但是jvm的内存模型规范是统一的 其实java的多线程并发问题最终都会反映在java的内存模型上 所谓线程安全无 非是要控制多个线程对某个资源的有序访问或修改 总结java的内存模型 要
  • 如何完成卷积神经网络有关的毕业设计

    前言 毕业设计对于每个学生而言都是一种十分痛苦的渡劫仪式 尤其是当你拿到的是完全陌生的毕业设计的时候 内心无疑有各种王尼玛从心中飘过 我在这里聊聊我在完成毕设的过程中得到的一些经验教训 因为我的毕业设计主题是卷积神经网络 所以在这里我的话题
  • 【云计算与数据中心规划】【期末复习题】【2022秋】

    文章目录 一 单选题 共7题 二 多选题 共15题 三 填空题 共7题 四 判断题 共5题 五 简答题 共7题 Reference 题量 41 满分 100 0 一 单选题 共7题 1 以下哪个虚拟机系统可以独立安装在计算机硬件之上 不需要
  • 什么是整洁的代码

    点击蓝色 五分钟学算法 关注我哟 加个 星标 天天中午 12 15 一起学算法 作者 xybaby 来源 https www cnblogs com xybaby p 11335829 html 写出整洁的代码 是每个程序员的追求 clea
  • opengl es3.0学习篇八:纹理

    OpenGL ESMIP 开发十年 就只剩下这套架构体系了 gt gt gt 学习内容来源and参考 opengl es 3 0编程指南 https www jianshu com p 4d8d35288a0f 3D图形渲染最基本的操作之一
  • 05 神经网络语言模型(独热编码+词向量的起源)

    博客配套视频链接 https space bilibili com 383551518 spm id from 333 1007 0 0 b 站直接看 配套 github 链接 https github com nickchen121 Pr
  • 基于opencv的家居智能安防机器视觉系统

    基于opencv的家居智能安防机器视觉系统 关键词 Windows 树莓派 python opencv 1 写在前面的话 大学4年很快过去了 因为疫情原因我们从大四上学期结束之后直接跳到了大学的尾声 毕业设计 毕业答辩 毕业的环境 回顾整个
  • 树莓派基础之外设开发编程

    外设开发篇 一 树莓派外设开发接口 二 树莓派wiringPi库 三 树莓派控制继电器 四 继电器组硬件控制开发 五 超声波模块介绍 六 串口通信协议概述 七 树莓派和语音模块的综合应用 一 树莓派外设开发接口 树莓派的接口 对主控芯片来说
  • 江西省电子专题大赛考点讲解三:CD4017_五阶约翰逊十进制计数器

    芯片引脚图 图CD4017 1 CD4017芯片引脚图 芯片功能概述 表CD4017 2 CD4017芯片真值表 图CD4017 3 CD4017芯片时序图 芯片实例讲解 实例一 输出十进制0 9 图CD4017 4 利用CD4017芯片作
  • Java 基础进阶篇(十八):正则表达式匹配规则和应用

    文章目录 一 正则表达式概述 二 正则表达式的匹配规则 三 正则表达式在方法中的应用 3 1 校验手机号 邮箱和座机电话号码 3 2 字符串的内容替换和分割 四 编程题目 4 1 表示数值的字符串 4 2 非严格递增连续数字序列 一 正则表
  • Java基础练习题03 数组

    1 定义一个数组来存储12个学生的成绩 72 89 65 58 87 91 53 82 71 93 76 68 统计各成绩等级 90分以上为 A 8089分为 B 7079分为 C 60 69分为 D 60分以下为E 学生人数 并将其放入到
  • selenium笔记

    爬取 1 coding utf 8 from selenium import webdriver browser webdriver Firefox browser get http www baidu com 获得浏览器对象后 通过 ge