封装 OBjectMap.py工具类
一、获取元素
获取元素思路流程图
获取元素封装代码
def element_get(self,driver,locate_type,locator_expression,timeout=10,must_be_visible=False):
"""
#获取元素
:param driver:
:param locate_type:定位类型
:param locator_expression:定位表达式
:param timeout:超时
:param must_be_visible:必须可见
:return:
"""
start_ms=time.time()*1000 #开始时间 获取当前时间戳
stop_ms=start_ms+(timeout*1000) #结束时间
for x in range(int(timeout*10)):
#寻找元素
try:
element=driver.find_element(by=locate_type,value=locator_expression)
if not must_be_visible: #如果元素不是必须可见的,直接返回元素
return element
else: #如果元素是必须可见的,则需要判断元素是否可见
if element.is_displayed(): #如果元素可见
return element
else: #如果不可见,抛出异常
raise Exception()
except Exception: #判断是否大于结束时间,大于则退出循环,反之,继续等待元素是否可见
now_ms=time.time()*1000
if now_ms>=stop_ms:
break
pass
time.sleep(0.1)
raise ElementNotVisibleException("元素定位失败,定位方式:"+locate_type+"定位表达式:"+locator_expression)
二、等待页面加载完成
等待页面加载思路流程图
等待页面加载完成封装代码
def wait_for_read_state_complete(self,driver,timeout=30):
"""
等待页面加载完成
:param driver:
:param timeout: 超时
:return:
"""
start_ms = time.time() * 1000 # 开始时间 获取当前时间戳
stop_ms = start_ms + (timeout * 1000) # 结束时间
for x in range(int(timeout*10)):
try:
read_state=driver.execute_script("return document.readyState")
except WebDriverException: #如果有driver错误,执行js会失败,直接跳过
time.sleep(0.03)
return True
if read_state=="complete":#如果页面全部加载完成返回True
time.sleep(0.01)
return True
else:#如果页面超时就break
now_ms=time.time()*1000
if now_ms>=stop_ms:
break
time.sleep(0.1)
raise Exception("打开网页时,页面元素在%s秒后依旧没有加载完成" % timeout)