您的位置:首页 > 编程语言 > Python开发

python3.5+selenium3.4自动化测试5_frame中的对象

2017-07-18 11:32 615 查看

这篇主要讲定位frame中的对象,经常会遇到使用firebug定位到某个元素,但运行的时候却找不到元素,很多情况是因为在web页面中经常有嵌套其他页面,所以一般我们需要在firebug的html页面中搜索一下frame或iframe



从图片可以看出(蓝色的是定位的元素)在一个iframe的页面中,所以如果没有切换到嵌套页面是找不到已经定位的元素的

贴下代码:

# _*_ coding: utf-8 _*_

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchAttributeException
import unittest,time,re
from time import strftime, localtime
from datetime import datetime

import HTMLTestRunner
import mod_login_on

class Createext(unittest.TestCase):
def setUp(self):
self.driver=webdriver.Chrome()
self.driver.implicitly_wait(30)
self.base_url="http://192.168.1.131"
self.verificationErrors=[]
self.accept_next_alert=True

def test_createext(self):
u"""2.1.创建三个分机"""
'''
2.1.创建三个分机
'''

driver=self.driver
driver.get(self.base_url+"/")
mod_login_on.login(self)

try:
time.sleep(3)
driver.switch_to_alert().accept()
driver.implicitly_wait(3) #智能等待3
# driver.find_element_by_id("current").click()
driver.find_element_by_xpath(".//*[@id='nav']/ul/li[4]/a").click()

#切换到frame中再找到对应的元素
driver.switch_to.frame("mainscreen")
driver.find_element_by_xpath(".//*[@id='btn_new_bulkexten']/span/span").click()
driver.find_element_by_xpath(".//*[@id='btn_save_bulk']/span/span").click()
driver.find_element_by_id("CHECKALL").click()
driver.find_element_by_xpath(".//*[@id='btn_delete_selected']/span/span").click()
driver.switch_to_alert().accept()

#从frame中切回主文档
driver.switch_to.default_content()

driver.find_element_by_xpath(".//*[@id='applyChanges_Button']/font").click()

#切换到frame中再找到对应的元素
driver.switch_to.frame("mainscreen")
driver.find_element_by_xpath(".//*[@id='btn_new_exten']/span/span").click()
Select(driver.find_element_by_id('edit_VOIPUser_Type')).select_by_value("0")#创建sip账号
driver.find_element_by_id("new_ext").clear()
driver.find_element_by_id("new_ext").send_keys(5001)
driver.find_element_by_id("edit_fullname").clear()
driver.find_element_by_id("edit_fullname").send_keys(5001)
driver.find_element_by_id("edit_callerid").clear()
driver.find_element_by_id("edit_callerid").send_keys(5001)
driver.find_element_by_id("edit_register_name").clear()
driver.find_element_by_id("edit_register_name").send_keys(5001)
driver.find_element_by_xpath(".//*[@id='btn_save']/span/span").click()
time.sleep(5)

driver.find_element_by_xpath(".//*[@id='btn_new_exten']/span/span").click()
Select(driver.find_element_by_id('edit_VOIPUser_Type')).select_by_value("1")#创建iax账号
driver.find_element_by_id("new_ext").clear()
driver.find_element_by_id("new_ext").send_keys(5002)
driver.find_element_by_id("edit_fullname").clear()
driver.find_element_by_id("edit_fullname").send_keys(5002)
driver.find_element_by_id("edit_callerid").clear()
driver.find_element_by_id("edit_callerid").send_keys(5002)
driver.find_element_by_xpath(".//*[@id='btn_save']/span/span").click()
time.sleep(5)

driver.find_element_by_xpath(".//*[@id='btn_new_exten']/span/span").click()
Select(driver.find_element_by_id('edit_VOIPUser_Type')).select_by_value("2")#创建iax账号
driver.find_element_by_id("new_ext").clear()
driver.find_element_by_id("new_ext").send_keys(5003)
driver.find_element_by_id("edit_fullname").clear()
driver.find_element_by_id("edit_fullname").send_keys(5003)
driver.find_element_by_id("edit_callerid").clear()
driver.find_element_by_id("edit_callerid").send_keys(5003)
driver.find_element_by_xpath(".//*[@id='btn_save']/span/span").click()
time.sleep(5)

#从frame中切回主文档
driver.switch_to.default_content()

driver.find_element_by_xpath(".//*[@id='applyChanges_Button']/font").click()

time.sleep(3)

driver.find_element_by_xpath(".//*[@id='nav']/ul/li[6]/a ").click()

driver.find_element_by_id("extstatus").click()

driver.switch_to.frame("mainscreen")

img_url=driver.find_element_by_xpath(".//*[@id='table_Ext_list']/tbody/tr[2]/td[1]/img").get_attribute('src')

img_name=img_url.split('/')[4]
if img_name=="status_gray.png":
pass
else:
driver.get_screenshot_as_file(u"D:/python/selenium/error_png/2.ext/2.1/%s.png" % datetime.now().strftime("%Y%m%d.%H%M%S.%f")[:-3])

time.sleep(10)#等待10

except:
driver.get_screenshot_as_file(u"D:/python/selenium/error_png/2.ext/2.1/%s.png" % datetime.now().strftime("%Y%m%d.%H%M%S.%f")[:-3])

def tearDown(self):
time.sleep(3)
self.driver.quit()
self.assertEqual([],self.verificationErrors)
if __name__=="__main__":
suite=unittest.TestSuite()
suite.addTest(Createext("test_createext"))

unittest.TextTestRunner().run(suite)


1.这边主要通过driver.switch_to.frame(“mainscreen”)这句话来切入到id=”mainscreen”的嵌套中,当然也可以用name,tag_name,只要在括号中填入对应的即可,通过这句话,切入到嵌套中之后,就可以按之前用firebug定位到的元素进行编写即可

2.driver.switch_to.default_content()这句话是退出原来的嵌套回到原来的主文档,就可以在原来的主文档操作,所以这边主要用firebug查看下,到底你对应的元素是在哪个iframe中

3.driver.switch_to.parent_frame()可以看到parent这个词,就是父的意思,主要遇到的是多个嵌套的问题,可能嵌套里面还有一个嵌套,比如

<html>
<iframe id="mainscreenA">
<iframe id="mainscreenB" / >
</iframe>
</html>


这时候你需要进入到B iframe处理完后又要退回Aiframe,就需要用到这个

driver.switch_to.frame("mainscreenA")#进入A
driver.switch_to.frame("mainscreenB")#进入B
driver.switch_to.parent_frame()  #退回A,如果当前是主文档,则无效果


4.这个代码中还有一个获取图片的名字,其实在很多爬虫图片中经常会爬取图片名,这边主要用到

img_url=driver.find_element_by_xpath(".//*[@id='table_Ext_list']/tbody/tr[2]/td[1]/img").get_attribute('src')

img_name=img_url.split('/')[4]


通过获得src的属性,获得图片的源地址src=”../images/status_gray.png”

通过split可以找到对应的图片名字

—————————————————–分割线—————————————————–

用实际用例代码长期更新,介绍selenium使用中的知识小点,希望大家关注

关注微信公众号:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息