目录
1、frame/iframe表单嵌套
解决方法:driver.switch_to.frame()
frame_element1 = self.driver.find_element(By.XPATH,"//*[@id=\"login_frame\"]")
time.sleep(1)
self.driver.switch_to.frame(frame_element1)
driver.switch_to.parent_frame()
切回到父framedriver.switch_to.default_content()
跳回最外层的页面
2、页面跳转到新的标签页(窗口切换)
解决方法:driver.switch_to.window(window_handle)
切换到新窗口。
windows = self.driver.window_handles
self.driver.switch_to.window(windows[1])
#或者for循环遍历
for handle in driver.window_handles:
# 先切换到该窗口
wb.switch_to.window(handle)
# 得到该窗口的标题栏字符串,判断是不是要操作的窗口
if '窗口标题' in driver.title:
# 如果是,那么WebDriver对象就是对应的该窗口,跳出循环
break
3、弹出警告框(alert/confim/prompt)
解决方法:alert = driver.switch_to.alert
,其中
- alert窗口:提示用户信息仅有确认按钮
- confirm窗口:有确认和取消按钮
- prompt窗口:有输入框、确认和取消按钮
- text: 返回(获取)alert/confirm/prompt中的文字信息
- accept():接受现有警告框
- dismiss(): 放弃现有警告框
- send_keys(keys_ToSend):发送文本至警告框
#切换到alert
alert = self.driver.switch_to.alert
print(alert.text)
sleep(2)
alert.accept()
#confirm弹框
self.driver.find_element_by_id('confirm').click()
confirm = self.driver.switch_to.alert
print(confirm.text)
sleep(3)
#确定
# confirm.accept()
#取消
confirm.dismiss()
#prompt弹框
self.driver.find_element_by_id('prompt').click()
prompt = self.driver.switch_to.alert
print(prompt.text)
prompt.send_keys('20')
sleep(3)
prompt.accept()
4、页面元素失去焦点导致脚本运行不稳定
解决方法:driver.switch_to.active_element
driver.switch_to.active_element.send_keys('filename')
time.sleep(2)
5、元素动态变化
解决方法:通过XPATH来定位,driver.find_element( By.XPATH, "" )
6、页面没有加载出来,对页面元素操作
解决方法1:WebDriverWait()
显示等待。等待单个的元素加载,通常配合until()
、until_not()
方法使用。
WebDriverWait(driver, 10,0.5).until(driver.find_element( By.CSS_SELECTOR,""))
解决方法2:time.sleep( ) 强制等待。当执行下一句代码,这种等待方式时间到了就执行下一个语句,但不能保证在等待的时间内元素真正被加载了出来。
time.sleep(10) # 表示强行等待10s
解决方法3:driver.implicitly_wait() 隐式等待。表示在规定的时间内页面的所有元素都加载完了就执行下一步,否则一直等到时间截止,然后再继续下一步。
driver.implicitly_wait(30) #等待30s
7、元素被遮挡,不可用,不可见
解决方法1:driver.maximize_window()
由于窗口大小改变引起的页面元素布局发生变化,被测元素被遮挡,可以将窗口最大化,再进行元素定位。
解决方法2:.is_enabled()
由于业务原因元素在某些情况下不可用(元素属性disabled,灰显),首先检查测试步骤是否符合业务逻辑,其次确认是否为业务流程上的Bug。
解决方法3:.is_displayed()
对于属性不一定可见的元素,在定位前首先判断其属性是否可见,是否被隐藏。
8、JavaScript代码代替无法实现的功能
解决方法1:如果页面内容过长,窗口最大化也无法查看到所有元素,可以通过执行JavaScript脚本实现滚动条的拖动等动作。(更多滚动条实现方法)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
解决方法2:假设一个输入框可以通过id='text'定位,但不能通过send_keys()输入文本内容,可以借助JavaScript代码来实现。 (更多页面元素的增删改查)
text = "input text"
driver.execute_script("var obj=document.getElementById('text'); obj.value=' " + text + " ';")
9、文件上传时无法操作Windows控件
解决方法:对于插件上传,需操作Windows控件,可通过安装AutoIt工具、编写脚本、保存为“.au3”文件、转换成“.exe”文件,再由自动化脚本os.system("D:\\upfile.exe")
实现上传/下载。
10、浏览器安全性强,不允许跨域调用出现报错
解决方法1:从浏览器about:config 里设置 signed.applets.codebase_principal_support = true;(地址栏输入about:config 即可进行设置)
解决方法2:在open的代码函数前加入如下代码:
try {
netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
}
catch (e) {
alert("Permission UniversalBrowserRead denied.");
}