多Frame框处理
在一个页面中可以嵌套另外一个页面,如frame/iframe技术,这是现在很多web应用中使用的一种方式,webdriver对象只能在一个页面(外层是默认的)中定位元素,需要一种方式将driver对象从外层切换给内层使用才能对内层的对象进行处理。
webdriver中提供API:driver.switch_to.frame()实现
1)切入Frame
第一种方式,默认是可以给ID或者name的
driver.switch_to.frame("login_frame")
第二种方式,可以传参iframe的元素对象
iframeObj = driver.find_element_by_xpath('//*[@id="login_frame"]')
driver.switch_to.frame(iframeObj)
# 切换到目标元素所在的frame
dr.switch_to.frame("iframeResult")
2)从Frame切入到主体
dr.switch_to.default_content()
警告框处理
警告框-alter,是一个模式框,该怎么使用代码的方式去操作他?
1、driver对象不在alter上,并且我们没办法去定位这个窗口的元素
2、driver.switch_to.alert:暂时将浏览器对象driver交给alert用
3、可以对alter警告框作什么事情:
text:返回(获取) alert/confirm/prompt 中的文字信息。
accept():接受现有警告框,就是点他的确定按钮
dismiss():放弃现有警告框,取消
send_keys(keysToSend):发送文本至警告框。
元素等待
如今很多web都在使用AJAX技术,运用这种技术的软件当浏览器加载页面时,页面上的元素可能不会被同步加载完成,如此一来,定位元素时就会出现困难。我们可以通过设置元素等待来改善这类问题导致的测试脚本不稳定
WebDriver提供了三种种元素等待方式:
1、强制等待:
time.sleep(5),单位是s,休眠,就是直接让线程休眠,这几秒啥事也不用干
2、隐式等待:
在脚本创建driver对象之后,给driver设置一个全局的等待时间,对driver的整个生命周期(创建到关闭)都起效。如果在设置等待时间(超时时间)内,定位到了页面元素,则不再等待,继续执行下面的代码如果超出了等待时间,则抛出异常
driver.implicity_wait(10)
注意:在使用隐式等待的时候,实际上浏览器会在你自己设定的时间内部不断的刷新页面去寻找我们需要
要求在后续写代码的时候,全部都要加上这句话
3、显式等待:
显示等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么就抛出Exception。(简而言之,就是直到元素出现才去操作,如果超时则报异常)
需要特别关注某一个元素的加载问题,才需要使用涉及到的方法:
#构造一个WebDriverWait的一个对象
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
参数说明:
driver:浏览器驱动
timeout:最长超时时间,默认以秒为单位
poll_frequency:检测的间隔步长,默认为0.5s
ignored_exceptions:超时后的抛出的异常信息,默认抛出NoSuchElementExeception异常。
util(method,info):直到满足某一个条件,返回结果,等不到就报错
method->expected_conditions.presence_of_element_located(locator):判断某个元素是否定位到了
locator-->(By.Id,"kw")\(By.Name,"wd")
需求:使用显示等待的方式去等百度首页的百度一下按钮显示出来,如果出来就点击,否则print()
注意:若同时设置了隐式等待和显示等待,则以隐式等待为第一优先级,也就是说,若隐式等待时间大于显示等待,显示等待时间设置无效,因为driver若找不到元素,会先等待隐式等待的时间,对time.sleep()没有影响,只要执行到这句代码,就会等待
页面滚动条操作
使用JS实现
• 到底部:js="document.documentElement.scrollTop=10000"
• 到顶部: js="document.documentElement.scrollTop=0"
• 左右移动:js="window.scrollTo(200,1000)"
• Js代码的执行需要用到的方法:driver.execute_script(js)