2.1 ActionChains模拟用户行为
需要模拟鼠标操作才能进行的情况,比如单击、双击、点击鼠标右键、拖拽
from selenium.webdriver.common.action_chains import ActionChains
selenium.webdriver.common.action_chains.ActionChains(driver)
调用ActionChains的方法时不会立即执行,会将所有的操作按顺序存放在一个队列里,当调用perform()方法时,队列中的事件会依次执行
支持链式写法或者分步写法
ActionChains(driver).click(ele).perform()
鼠标和键盘方法列表:
perform() 执行链中的所有动作
click(on_element=None) 单击鼠标左键
context_click(on_element=None) 点击鼠标右键
double_click(on_element=None) 双击鼠标左键
move_to_element(to_element) 鼠标移动到某个元素
ele.send_keys(keys_to_send) 发送某个词到当前焦点的元素
========== 不常用 ==========
click_and_hold(on_element=None) 点击鼠标左键,不松开
release(on_element=None) 在某个元素位置松开鼠标左键
key_down(value, element=None) 按下某个键盘上的键
key_up(value, element=None) 松开某个键
drag_and_drop(source, target) 拖拽到某个元素然后松开
drag_and_drop_by_offset(source, xoffset, yoffset) 拖拽到某个坐标然后松开
move_by_offset(xoffset, yoffset) 鼠标从当前位置移动到某个坐标
move_to_element_with_offset(to_element, xoffset, yoffset) 移动到距某个元素(左上角坐标)多少距离的位置
send_keys_to_element(element, keys_to_send) 发送某个键到指定元素
2.2 hover菜单栏弹出
from selenium.webdriver.common.action_chains import ActionChains
ActionChains(driver).move_to_element(ele1).perform()
实例:打开淘宝,鼠标移动到“我的淘宝”,点击“已买到的宝贝”
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains
driver=webdriver.Firefox()
driver.get("https://www.taobao.com/")
print(driver.title)
sleep(3)
ele1=driver.find_element_by_css_selector("#J_SiteNavMytaobao > div:nth-child(1) > a:nth-child(1) > span:nth-child(1)")
ActionChains(driver).move_to_element(ele1).perform()
ele2=driver.find_element_by_css_selector("#J_SiteNavMytaobao > div:nth-child(2) > div:nth-child(1) > a:nth-child(1)")
sleep(2)
ele2.click()
2.3 模拟用户登录
查找登录框-》输入用户名和密码-》触发登录-》判断登录是否成功-》打印结果
实例:登录淘宝,并验证是否登录成功
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains
driver=webdriver.Firefox()
driver.get("https://www.taobao.com/")
print(driver.title)
sleep(3)
driver.find_element_by_css_selector(".site-nav-sign > a:nth-child(1)").click()
sleep(1)
driver.find_element_by_css_selector("#J_Quick2Static").click()
sleep(1)
username=driver.find_element_by_css_selector("#TPL_username_1")
username.clear()
username.send_keys("用户名")
sleep(1)
password=driver.find_element_by_css_selector("#TPL_password_1")
password.clear()
password.send_keys("密码")
sleep(1)
button=driver.find_element_by_css_selector("#nc_1_n1z")
action=ActionChains(driver)
action.click_and_hold(button).perform()
action.reset_actions()
action.move_by_offset(300,0).perform()
action.key_up(button)
sleep(5)
driver.find_element_by_css_selector("#J_SubmitStatic").click()
这里执行到滑块有点问题,每次滑完后老是提示错误,导致登录不上去
在网上查了一下,找到了问题所在:淘宝登录滑块出错问题
所以要设置ip代理,这里暂时还没学到,先放一放,后面学到再补充。
2.4 网页等待时间
-
为什么需要等待时间–》等系统稳定
网页需要加载对应的资源文件,页面渲染,窗口处理等等 -
自动化测试常用的等待时间
强制等待 :
from time import sleep
sleep(5) # 强制等待5秒再执行下一步,缺点是不管资源是不是完成,都必须等待隐性等待:
driver.implicitly_wait(10) # 隐性等待,最长等10秒
设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下 一步,弊端就是程序会一直等待整个页面加载完成,到浏览器标签栏那个加载圈不再转
注意:对driver起作用,所以只要设置一次即可,没有必要到处设置显性等待:
WebDriverWait 需要配合 until和until_not,程序每隔N秒检查一次,如果成功,则执行下一步,否 则继续等待,直到超过设置的最长时间
from selenium.webdriver.support.wait import WebDriverWait语法:
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC结论: 隐性等待和显性等待可以同时用,等待的最长时间取两者之中的较大者