定位元素时经常会出现定位不到元素,这时候我们需要观察标签的上下文,一般情况下这些定位不到的元素存放在了frame或者放到窗口了,只要我们切入进去就可以很容易定位到元素。

处理frame时主要使用到switch_to.frame()(切入frame也可以些写成switch_to_frame,不过这个已经用的很少了)和switch_to_default_content()两个方法,一个主要是切入到iframe里面,一个是切换到主文档中,一般情况这两个要配合着用,切进去以后操作完成元素以后,就要在切回到主文档,避免一些其他的错误。

switch_to.frame()  #如果frame 中有name和id属性就直接使用id或者name进行定位,如果没有id和name属性,可以通过find_element_by_xpath(或者其他定位)方法定位到这个iframe元素,然后把这个元素传进去。

当有两个frame时,需要先进入父frame,再进入子frame中,对子frame中的元素操作后,需要先切回到父frame中,再回到最外面的主文档区域。

代码举例:

以禅道测试人员登录后进行确认BUG为例

#进入BUG详情页后进入确认BUG页面
driver.find_element(By.XPATH,"//a[contains(@href,'/zentao/bug-confirmBug')]").click()
confirm_iframe=driver.find_element(By.XPATH,"//iframe[@id='iframe-triggerModal']") #定义一个确认BUG的frame元素对象
driver.switch_to.frame(confirm_iframe) #进入frame
time.sleep(1)
driver.find_element(By.XPATH,"//div[@id='assignedTo_chosen']").click() ##对frame中的元素操作,此处操作下拉框
driver.find_element(By.XPATH,"//li[@title='K:开发001']").click() #下拉框输入值
beizhu_iframe=driver.find_element(By.XPATH,"//iframe[@class='ke-edit-iframe']") ##进入备注子frame中,再定义一个frame对象
driver.switch_to.frame(beizhu_iframe) #进入子frame
driver.find_element(By.XPATH,"//body[@class='article-content']").send_keys("确认问题") #对子frame的元素进行操作
driver.switch_to.parent_frame() #切出子frame,回到父frame,才能对父frame上的元素再次操作
driver.find_element(By.XPATH,"//button[@type='submit'][@class='btn btn-wide btn-primary']").click() #对父frame上的元素进行操作
time.sleep(2)
driver.switch_to.default_content() ##跳出父iframe,回到最外面的HTML
time.sleep(2)
##禅道退出,对主文档上的元素进行操作
driver.maximize_window()
driver.find_element(By.XPATH, "//span[@class='user-name']").click()
driver.find_element(By.XPATH, "//div[1]/div/div/div/ul/li/ul/li[13]/a").click()
time.sleep(1)

最新文章

  1. Hadoop Shell命令大全
  2. Orleans 客户端请求的消息流转以及消息在Silo中再路由机制
  3. Winform自定义窗体样式,实现标题栏可灵活自定义
  4. js调用后台方法(如果你能容忍执行的后台方法变成一个常量)
  5. SG 复习全部 (全部SG 总览)
  6. 搭建一个简单的Struts2框架
  7. Weka 入门3
  8. Laravel 安装记录
  9. IBatis入门
  10. 3.Apache ZooKeeper数据模型
  11. TCP/IP 三次握手
  12. Day11 expandtabs 制表
  13. Server Memory Server Configuration Options 服务器内存服务配置选项
  14. Java如何根据主机名(域名)获取IP地址?
  15. 10.110.20.16上的MQTT server
  16. 使用 DirectX 创建 3D 图形
  17. Intel的AVX2指令集解读
  18. ElasticSearch的安装、使用、踩坑
  19. 升级nodejs至最新
  20. U盘安装Win7系统,遇到硬盘鼠标键盘失灵等情况,如何安装U盘中加入USB3.0驱动的支持

热门文章

  1. Python脚本抓取京东手机的配置信息
  2. 音视频开发:为什么推荐使用Jetpack CameraX?
  3. NumPy之:使用genfromtxt导入数据
  4. Day003 注释、标识符和关键字
  5. 日志框架整合报错Class path contains multiple SLF4J bindings.
  6. Java中实现某方法和重写某方法的区别
  7. Spring Boot & Cloud 轻量替代框架 Solon 1.3.35 发布
  8. Spring MVC工作原理及源码解析(二)DispatcherServlet实现原理及源码解析
  9. .NET之API版本控制
  10. python爬虫——汽车之家数据