Web自动化测试(无法定位元素)

目录

1、frame/iframe表单嵌套

2、页面跳转到新的标签页(窗口切换)

3、弹出警告框(alert/confim/prompt)

4、页面元素失去焦点导致脚本运行不稳定

5、元素动态变化

6、页面没有加载出来,对页面元素操作

7、元素被遮挡,不可用,不可见

8、JavaScript代码代替无法实现的功能

9、文件上传时无法操作Windows控件

10、浏览器安全性强,不允许跨域调用出现报错

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() 切回到父frame
  • driver.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、页面没有加载出来,对页面元素操作

        解决方法1WebDriverWait() 显示等待。等待单个的元素加载,通常配合until()until_not()方法使用。

 WebDriverWait(driver, 10,0.5).until(driver.find_element( By.CSS_SELECTOR,""))

        解决方法2time.sleep( ) 强制等待。当执行下一句代码,这种等待方式时间到了就执行下一个语句,但不能保证在等待的时间内元素真正被加载了出来。

time.sleep(10) # 表示强行等待10s

        解决方法3driver.implicitly_wait() 隐式等待。表示在规定的时间内页面的所有元素都加载完了就执行下一步,否则一直等到时间截止,然后再继续下一步。

driver.implicitly_wait(30) #等待30s

7、元素被遮挡,不可用,不可见

        解决方法1driver.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."); 
      } 

猜你喜欢

转载自blog.csdn.net/m0_58807719/article/details/130117450