web自动化--操作
2020-05-12 本文已影响0人
xiaohan_zhang
一、操作元素
- 清空数据
driver.find_element_by_id('kw').clear()
- 输入数据
driver.find_element_by_id('kw').send_keys('央视网')
- 点击
driver.find_element_by_id('su').click()
- 上传文件
driver.find_element_by_css_selector('#upfile').send_keys('文件路径')
二、操作浏览器
- 浏览器最大化
driver.maximize_window()
- 设置窗口大小
driver.set_window_size(600, 520)
- 设置浏览器窗口位置
driver.set_window_position(200, 100)
- 后退
driver.back()
- 前进
driver.forward()
- 刷新
driver.refresh()
- 关闭当前窗口
driver.close()
- 关闭浏览器驱动对象
关闭webdriver启动的所有窗口
driver.quit()
- 获取页面title
driver.title
一般为判断上一步操作是否成功 - 获取页面url
driver.current_url
一般为判断上一步操作是否成功
三、获取元素信息
- 获取元素的大小
driver.find_element_by_id('1').size
- 获取元素的文本
driver.find_element_by_id('1').text
- 获取元素在屏幕中的位置
driver.find_element_by_id('1').location
- 获取元素属性值
driver.find_element_by_id('1').get_attribute('fk')
判断一组元素是否为想要的元素,或判断元素属性值是否正确 - 判断元素是否可见
driver.find_element_by_id('1').is_displayed()
- 判断元素是否可见
driver.find_element_by_id('1').is_enabled())
- 判断元素是否选中
driver.find_element_by_id('1').is_selected())
- 获取包括元素在内的html内容
driver.find_element_by_id('1').get_attribute('outerHTML')
- 获取元素内部的html
driver.find_element_by_id('1').get_attribute('innerHTML')
四、鼠标操作
from selenium.webdriver.common.action_chains import ActionChains
- 获取鼠标操作对象
action = ActionChains(drive)
- 执行鼠标操作
perform()
- 右击
action.context_click()
action.context_click(drive.find_element_by_id('mytxtdafdfasdf')).perform()
- 双击
action.double_click()
action.double_click(drive.find_element_by_css_selector('div.gwA18043_ind01')).perform()
- 悬停
action.move_to_element()
action.move_to_element(drive.find_element_by_css_selector('#lmdq a')).perform()
- 拖动
action.drag_and_drop(source, target)
source: 源元素 要拖动的元素
target: 目标元素 要拖动到的元素
action.drag_and_drop_by_offset(source, xoffset, yoffset)
source: 源元素 要拖动的元素
xoffset, yoffset: 移动到的位置
五、键盘操作
from selenium.webdriver.common.keys import Keys
- 删除
send_keys(Keys.BACK_SPACE)
- 空格
send_keys(Keys.SPACE)
- Tab键
send_keys(Keys.TAB)
- 回退键ESC
send_keys(Keys.ESCAPE)
- 回车
send_keys(Keys.ENTER)
- 全选
send_keys(Keys.CONTROL, 'a')
- 复制
send_keys(Keys.CONTROL, 'c')
- 粘贴
send_keys(Keys.CONTROL, 'v')
- 剪切
send_keys(Keys.CONTROL, 'x')
六、元素等待
在定位页面元素时,如果未找到,会在指定时间内等待的过程。
-
隐式等待
针对全局有效
参数秒
driver.implicitly_wait(10)
在创建driver时,为浏览器对象创建一个等待时间,这个方法是得不到某个元素就等待一段时间,直到拿到某个元素位置。超时会抛出NoSuchElementException异常。 -
显式等待
针对单个元素有效
明确的要等到某个元素出现或者某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,则NoSuchElementException抛异常。
from selenium.webdriver.support.ui import WebDriverWait
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
element = WebDriverWait(driver, timeout=10, poll_frequency=0.5).until(
lambda x: x.find_element_by_id('kw')
)
element.send_keys('海贼王')
七、选择框
- 下拉框-单选
from selenium.webdriver.support.ui import Select
# 找到select元素
select = Select(driver.find_element_by_css_selector('#ss_single'))
select.select_by_value('小雷老师')
select.select_by_index(2)
select.select_by_visible_text('小雷老师')
- 下拉框-多选
select = Select(wd.find_element_by_css_selector('#ss_multi'))
# 全不选
select.deselect_all()
select.select_by_value('小雷老师')
select.select_by_index(0)
select.select_by_visible_text('小凯老师')
- radio 单选框
radio = wd.find_element_by_css_selector('#s_radio input[checked="checked"]')
# 点选小雷老师
wd.find_element_by_css_selector('#s_radio input[value="小雷老师"]').click()
- checkbox 多选框
checkboxs = wd.find_elements_by_css_selector('#s_checkbox input[checked="checked"]')
# 为了确保把所有想选的都选中,把所有被选中的都点一遍,变成未选中状态,然后再去选择
for checkbox in checkboxs:
checkbox.click()
wd.find_element_by_css_selector('#s_checkbox input[value="小雷老师"]').click()
wd.find_element_by_css_selector('#s_checkbox input[value="小凯老师"]').click()
八、弹出框
- alert 警告框
alert = driver.switch_to.alert
# 点击确定按钮
alert.accept()
# 获取alert文本
alert.text
- confirm 确认框
# 点击确定按钮
driver.switch_to.alert.accept()
# 点击取消按钮
driver.switch_to.alert.dismiss()
- prompt 提示框
prompt = driver.switch_to.alert
# 输入信息
prompt.send_keys('web自动化')
# 点击确定按钮 提交
prompt.accept()
# 取消按钮
prompt.dismiss()
九、滚动条
js脚本实现
# 0:左边距 1000:上边距 单位像素
js = "window.scrollTo(0, 1000)"
# 调用js代码
driver.execute_script(js)
十、窗口切换
- iframe切换
wd = webdriver.Chrome()
wd.get('http://cdn1.python3.vip/files/selenium/sample2.html')
wd.implicitly_wait(5)
# 切换到iframe中,参数id或name属性值
wd.switch_to.frame('frame1')
# 如果没有id、name属性,可以根据其他属性查找
# wd.switch_to.frame(wd.find_element_by_css_selector('[src="sample1.html"]'))
elements = wd.find_elements_by_css_selector('.plant')
for element in elements:
print(element.text)
# 返回上一级html
# wd.switch_to.parent_frame()
# 切换到主html 即最开始的html
wd.switch_to.default_content()
- 多窗口切换
wd = webdriver.Chrome()
wd.get('http://tv.cctv.com')
wd.implicitly_wait(5)
# 找到节目单
# link = wd.find_element_by_css_selector('.nav li:nth-child(3) a')
link = wd.find_element_by_css_selector('.left a:nth-child(1)')
# 当前窗口
main_window = wd.current_window_handle
print(wd.title)
sleep(2)
link.click()
# 切换到新窗口
for handle in wd.window_handles:
wd.switch_to.window(handle)
if link.text in wd.title:
break
# 当前窗口的title
print(wd.title)
sleep(2)
# 点击链接打开新的标签页,回到主窗口,跳转窗口前保存
wd.switch_to.window(main_window)
十一、截屏、验证码处理
- 截屏
driver.get_screenshot_as_file('./cctv.png')
# 由于测试时可能失败多次,产生多个截图,可以用时间戳命名
name = int(time.time())
driver.get_screenshot_as_file('./' + str(name) + '.png')
- 验证码
selenium没有提供处理验证码的方法
(1)去掉验证码(测试环境下采用)
(2)设置万能验证码(生产环境和测试环境下采用)
(3)验证码识别技术(通过Python-tesseract来识别图片类型验证码,识别率很难达到100%)
(4)记录cookie(通过记录仪cookie进行跳过登录)
十二、cookie
获取网站所有cookie
driver.get_cookies()
获取指定cookie(name对应的值)
driver.get_cookie('BIDUPSID')
添加cookie
driver.add_cookie({'name': 'BDUSS', 'value': BDUSS})