首先-明确范围 -- web自动化测试前端
其次-明确条件 -- 元素定位都正确web
而后-明确现象 -- 元素定位会失败浏览器
最后-得出结论服务器
判判定位的元素属性信息是否正确(已经肯定正确),可是业务逻辑是否正确须要肯定网络
受到网络/服务器/浏览器影响,页面加载过慢会形成定位失败,须要经过元素等待处理框架
目标元素是否直接可见/是否须要鼠标动做才能显现出来iphone
默认浏览器大小的页面加载范围太小形成部分元素遮挡,须要启动浏览器后最大化窗口ide
受前端动态加载技术影响,页面动态加载数据有时须要监听滚动条动做(长页面翻页),须要操做滚动条测试
页面操做过程当中的窗口弹框alert也会影响页面定位和操做,须要先处理alertspa
页面部分超连接点击后会在新窗口中打开,目标元素在新窗口中时,须要进行窗口切换
收到前端页面框架影响,页面内容可能会在frame子页中,须要frame切换
因为这个问题回答清楚须要不少Selenium的API经常使用操做,因此针对这个问题的回答要特别注意代码实现
业务逻辑
# 注意业务逻辑的前后顺序 -- 打开首页就直接登陆操做
# 2.输入网址
# 驱动对象调用get("协议://URL")
driver.get("http://www.xxx.com")
# 3.业务操做
# 登录操做 输入用户名/密码/验证码
driver.find_element_by_id("username").send_keys("xxxxxx")
driver.find_element_by_id("password").send_keys("123456")
driver.find_element_by_id("verify_code").send_keys("8888")
driver.find_element_by_name("sbtbutton").click()
元素等待
# 硬等待
# 使用sleep,暂停程序执行
time.sleep(3)
driver.find_element_by_id("q").send_keys("iphone")
# 隐式等待 -- 设置一次 -- 针对全局--全部元素定位
# selenium.common.exceptions.NoSuchElementException
# 调用-使用浏览器驱动对象调用 参数-等待时长秒
driver.implicitly_wait(10)
driver.find_element_by_id("q").send_keys("iphone")
# 显式等待 -- 针对指定的元素定位 -- 定位失败是的抛出异常
# selenium.common.exceptions.TimeoutException
# 实例化一个WebDriverWait类的对象, WebDriverWait类的对象调用until
wait = WebDriverWait(driver, timeout=10, poll_frequency=1)
userA_element = wait.until(lambda d: d.find_element_by_id("q"))
userA_element.send_keys("iphone")
鼠标动做
# 实例化一个动做链对象
# 动做链对象调用动做方法--move_to_element(目标元素对象)
# 动做链对象调用perfom()
ActionChains(driver).move_to_element(driver.find_element_by_class_name("u-g-cart")).perform()
最大化窗口
# 1.打开浏览器
# 实例化浏览器驱动对象
# obj = 类名()
driver = webdriver.Chrome()
# 浏览器窗口最大化
driver.maximize_window()
操做滚动条
# 操做滚动条
driver.execute_script("window.scrollTo(0,100000)")
# 点击回到顶部
driver.find_element_by_class_name("ico-slidebar4").click()
处理alert
# 关闭弹出框
driver.switch_to.alert.dismiss()
窗口切换
# 切换窗口 -- 通常规律默认最后一个就是新窗口句柄
driver.switch_to.window(driver.window_handles[-1])
frame切换
# frame切换 主页--子页
driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))
# 点击去购物车结算
driver.find_element_by_link_text("去购物车结算").click()
# frame切换 子页--主页
driver.switch_to.default_content()