Windows Mobile 5.0 (3) -- 在Mobile Web Form中使用javascript

补充在(2)中的内容:

Mobile Web Form与Web Form的区别:

Mobile Web Form不支持Theme,但Mobile Web Form可以使用StyleSheet。

修改(1)的内容:

当模拟器和Microsoft ActiveSync无法同步时,可以按照下列步骤就可以立即恢复同步。
1.在Tools->Device Emulator Manager中,选择正在同步的设备右键,选择"Uncradle"。
2.打开Microsoft ActiveSync,按connect,这时候会出现同步画面。
3.在Tools->Device Emulator Manager中,选择"Cradle"继续同步。

Mobile页面上调用所有Asp.net的控件必须订制。

在Mobile Web Form中使用javascript的方法:

由于有些手机能够支持javascript,所以只有支持javascript的手机才能显示出效果,所以需要定制,在支持的手机中实现javascript效果。

涉及代码:

     < mobile:Form  id ="Form1"  runat ="server"  OnLoad ="Form1_Load" >
        
< mobile:Label  ID ="Label1"  Runat ="server"  Font-Bold ="True" > Student Name: </ mobile:Label >
        
< mobile:TextBox  ID ="txtStName"  Runat ="server" ></ mobile:TextBox >
        
< mobile:Command  ID ="Command1"  Runat ="server"  OnClick ="Command1_Click1" > Get Info </ mobile:Command >
        
< mobile:Command  ID ="Command2"  Runat ="server" > Client Event </ mobile:Command >
        
< mobile:Panel  ID ="Panel1"  Runat ="server" >
            
< mobile:DeviceSpecific  ID ="DSP1"  Runat ="server" >
                
< Choice  Filter ="isHTML32"  Xmlns ="http://schemas.microsoft.com/mobile/html32template" >
                    
< ContentTemplate >
                    
< asp:CheckBox  ID ="chkBox"  runat ="server"  Text ="CheckBox Control"   />
                    
< Script  language ="jscript"  for ="window"  event ="onload" >
                            window.Form1.Command1.onclick 
= ShowMsg;
                            
function ShowMsg(e)
                            
{
                                alert(
"Msg!");
                            }

                        
</ Script >
                        
< Script  language ="jscript"  for ="Command2"  event ="onclick" >
                            alert(
"Msg!");
                        
</ Script >  
                    
</ ContentTemplate >
                
</ Choice >
            
</ mobile:DeviceSpecific >
        
</ mobile:Panel >
    
</ mobile:Form >


其中在panel中放置定制<mobile:DeviceSpecific ID="DSP1" Runat="server">

定制条件是只要支持HTML就行<Choice Filter="isHTML32">

在ContentTemplate中插入script代码,其中for是针对的控件,Mobile Web Form中用window代替document。Event表示对于指定的控件,出现指定的事件时执行scipt中的操作。

第一个script中,当页面onload的时,执行script,并指定command1的onclick事件。
第二个script中,只有当command2点击时,才执行script。

在ContentTemplate中就能添加asp.net控件,更能添加atlas等。

关于script的属性可以看MSDN的SCRIPT Element | script Object

里面对script的每个属性,使用方法都有实例。

 
#!/usr/bin/env python import datetime # -*- coding: UTF-8 -*- import subprocess import time import sys import os import json import requests import logging import HTTP_Requests as hr import Response_Processing as rp import Static_Functions as sf import Excel_Operator as eo import openpyxl # try: # from . import RSAEncrypt # except: import RSAEncrypt class HTTP(): def __init__(self, ip=None, username=None, password=None): self.logger = logging.getLogger(self.__class__.__name__) # print(self.__class__.__name__()) self.ip=ip self.username=username self.password=password self.stok = None self.cookie = None self.login_status = False # dut对象记录所有测试结果的列表 self.test_results = [] # 创建dut对象的Excel工作簿对象 self.wb = openpyxl.Workbook() # 添一个工作表 self.ws = self.wb.active self.ws.title = &#39;测试结果&#39; self.headers = {"Host": "%s" % self.ip, "Connection": "keep-alive", "Accept": "application/json, text/javascript, */*; q=0.01", "Origin": "http://%s" % self.ip, # "X-Requested-With": "XMLHttpRequest", "User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64) " "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "Referer": "http://%s/webpages/login.html" % self.ip, "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.8", "cookie": None } # 先将样机webserver状态设置为False self.webserver_status = False # 再调用http_request_init()检查样机webserver状态并登陆获取stok和cookie self.http_request_init() def _post_model_form_data(self, model_name=None, form_name=None, data=None): # used by other function to post the whole data to the dut self.logger.info(&#39; start _post_model_form_data &#39;) submit_data = { "module": model_name, "form": form_name, "data": data } self.logger.info(&#39;_post_model_form_data Post data is %s&#39; % submit_data) output = self.http_request_op(submit_data) return output def http_request_op(self, submit_data=None): maxtrytime = 3 sleep_time = 1 connection_interval = 3 for item in range(1, maxtrytime): try: time.sleep(sleep_time) if sleep_time != 1: self.logger.debug(&#39;************** try to post data %s times **************&#39; % item) resp_dict = self._http_request_op(submit_data=submit_data) return resp_dict except ValueError as ex: raise ValueError(&#39;Post data form error, web server code= %s&#39; % ex) except RuntimeError: sleep_time += connection_interval if item < maxtrytime: continue except requests.exceptions.ConnectionError: sleep_time += connection_interval if item < maxtrytime: continue else: self.logger.error(&#39;Connection error&#39;) except requests.exceptions.HTTPError: sleep_time += connection_interval if item < maxtrytime: continue else: self.logger.error(&#39;HTTP error&#39;) raise Exception(f&#39;Post data error, submit_data is {submit_data}&#39;) def _http_request_op(self, submit_data=None): retry = 1 while not self.login_status: self.http_request_init() if self.login_status: self.logger.info(&#39;Login dut success!&#39;) break self.logger.warning(&#39;Login failed, Retry to login, times=%s&#39; % retry) if retry >= 5: raise RuntimeError("Login %s failed" % self.ip) retry += 1 time.sleep(3) # separators参数的作用是去掉,:后面的空格 raw_data = json.dumps(submit_data[&#39;data&#39;], ensure_ascii=False, separators=(&#39;,&#39;, &#39;:&#39;)) form_raw = {"data": raw_data} url = "http://%s/cgi-bin/luci/;stok=%s/admin/%s?form=%s" % ( self.ip, self.stok, submit_data[&#39;module&#39;], submit_data[&#39;form&#39;]) self.logger.debug("[+] url (%s)" % url) try: resp = requests.post(url=url, data=form_raw, headers=self.headers, timeout=30) self.logger.debug("Post data function success") #首先检查页面状态码是否为200 if resp.status_code == 200: js = json.loads(resp.content) time.sleep(0.2) # 检查页面响应错误码是否为0 if str(js[&#39;error_code&#39;]) == &#39;0&#39;: self.logger.debug(&#39;Post data form success!&#39;) return js # 检查页面响应错误码不为0时,在发送一次请求 else: self.logger.debug(&#39;*******************页面错误码不为0,再次尝试登陆****************************&#39;) self.http_request_init() time.sleep(3) resp2 = requests.post(url=url, data=form_raw, headers=self.headers, timeout=30) if resp2.status_code == 200: js2 = json.loads(resp2.content) time.sleep(0.2) # 检查页面响应错误码是否为0 if str(js2[&#39;error_code&#39;]) == &#39;0&#39;: self.logger.debug(&#39;Post data form success!&#39;) self.logger.debug(&#39;js2 is %s&#39; % js2) return js2 else: raise RuntimeError(&#39;Web server return error, error code = %d&#39; % js2[&#39;error_code&#39;]) else: raise RuntimeError(&#39;Web server return error, http code = %d&#39; % resp2.status_code) else: raise RuntimeError(&#39;Web server return error, http code = %d&#39; % resp.status_code) except requests.exceptions.HTTPError as ex: self.logger.error(&#39;Post data form failed! Http error:%s&#39; % ex) raise ex except requests.exceptions.URLRequired as ex: self.logger.error(&#39;Post data form failed! Url error:%s&#39; % ex) raise ex except Exception as ex: self.logger.error(&#39;Post data form failed! Unkonwn error:%s&#39; % ex) raise ex def check_server_open(self): headers_of_check_server_open = {"Host": "%s" % self.ip, "Connection": "keep-alive", "Accept": "application/json, text/javascript, */*; q=0.01", "Origin": "http://%s" % self.ip, "X-Requested-With": "XMLHttpRequest", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/113.0", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "Referer": "http://%s/webpages/login.html" % self.ip, "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.8" } url_of_check_server_open = "http://%s/webpages/login.html" % self.ip try: resp = requests.get(url=url_of_check_server_open, headers=headers_of_check_server_open, timeout=30) if resp.status_code == 200: self.webserver_status = True except Exception: # 此处用于尝试重新发送请求检查webserver状态: retry_times = 5 self.logger.debug("即将开始重新尝试,retry_times =" + str(retry_times)) while ((self.webserver_status == False) and (retry_times >= 1)): try: resp2 = requests.get(url=url_of_check_server_open, headers=headers_of_check_server_open, timeout=30) if resp2.status_code == 200: self.webserver_status = True print(&#39;----------------------------------------重新连接webserver成功,确认样机webserver已开启&#39;) except: retry_times = retry_times - 1 print(&#39;----------------------------------------尝试第" + str(5 - retry_times) + "次连接样机失败,请检查样机状态&#39;) time.sleep(0.7) def http_request_init(self): self.check_server_open() # webserver状态检查函数 print(f&#39;----------------------------------------样机webserver状态为{self.webserver_status}&#39;) if self.webserver_status == True: # webserver状态检查成功,进入样机是否为出厂设置检查分支 self.check_status = &#39;&#39; # check_status来储存样机是否处于默认出厂状态 self.check_status = self.check_status_and_set_password() self.check_status = self.check_status.lower() # 全小写避免样机差异,default代表处于默认出厂状态,modify代表已经被设置 # print(&#39;----------------------------------check_status=&#39; + str(self.check_status)) # 其实是三个分支 if self.check_status == (&#39;default&#39;): self.logger.info(&#39;----------------------------------------检查到样机的状态为默认的出厂设置&#39;) self.mark_password = self.password # 用于记录用户设定的密码,然后在后面的set_new_password时传入 self.password = &#39;admin&#39; self.get_stok_cookie_by_password() # 包含了get uptime算密码的逻辑,但是算之前先把self.password设置为admin self.set_new_password() print(&#39;----------------------------------------出厂状态下,样机设置密码成功&#39;) self.password = self.mark_password self.get_stok_cookie_by_password() # 设定新密码后重新登录拿cookie和stok self.login_status = True # headers添cookie self.headers["cookie"] = self.cookie print(&#39;----------------------------------------出厂状态下,样机登录成功&#39;) if self.check_status == (&#39;modify&#39;): self.get_stok_cookie_by_password() self.login_status = True # headers添cookie self.headers["cookie"] = self.cookie print(&#39;----------------------------------------已修改密码状态下,样机登陆成功&#39;) else: print(&#39;----------------------------------------样机webserver未开启,请检查样机状态后重新实例化ERRouter_int类&#39;) def check_status_and_set_password(self): headers_of_check_status_and_set_password = { "Host": "%s" % self.ip, "Connection": "keep-alive", "Accept": "application/json, text/javascript, */*; q=0.01", "Origin": "http://%s" % self.ip, "X-Requested-With": "XMLHttpRequest", "User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64) " "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "Referer": "http://%s/webpages/login.html" % self.ip, "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.8" } post_data_of_check_status_and_set_password = {"data": &#39;{"method":"get"}&#39;} url_of_check_status_and_set_password = &#39;http://%s/cgi-bin/luci/;stok=/userconfig?form=cfg_save&#39; % self.ip resp = requests.post(url=url_of_check_status_and_set_password, data=post_data_of_check_status_and_set_password, headers=headers_of_check_status_and_set_password) time.sleep(0.5) if resp.status_code == 200: js = json.loads(resp.content) time.sleep(0.2) if str(js[&#39;error_code&#39;]) == &#39;0&#39;: return js[&#39;result&#39;][&#39;config_status&#39;] else: print(&#39;----------------------------------------检查样机是否为出厂设置状态失败,error_code=%s&#39; % str(js[&#39;error_code&#39;])) time.sleep(0.2) return &#39;----------------------------------------获取dut状态失败,错误位于【error_code】,可能与post表单格式有关&#39; else: print(&#39;----------------------------------------检查样机是否为出厂设置状态失败,http 响应 status_code=%s&#39; % str(resp.status_code)) time.sleep(0.2) return &#39;----------------------------------------获取dut状态失败,错误位于【http 响应 status_code】,可能与url和headers有关&#39; def get_stok_cookie_by_password(self): # get_stok_cookie_by_password()这个函数会自己去得到uptime然后计算密,但是为了方便维护,把算密码和密分开写 _uptime = self.get_uptime() # get_uptime()和get_encrypt_password()都会return相应值 time.sleep(2) finaly_password = self.get_encrypt_password(up_time=_uptime) post_data_of_get_stok_cookie_by_password = { "data": &#39;{"method":"login","params":{"username":"admin","password":"%s"}}&#39; % finaly_password } headers_of_get_stok_cookie_by_password = { "Host": "%s" % self.ip, "Connection": "keep-alive", "Accept": "application/json, text/javascript, */*; q=0.01", "Origin": "http://%s" % self.ip, "X-Requested-With": "XMLHttpRequest", "User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64) " "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "Referer": "http://%s/webpages/login.html" % self.ip, "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.8" } url_of_get_stok_cookie_by_password = "http://%s/cgi-bin/luci/;stok=/login?form=login" % self.ip resp = requests.post(url=url_of_get_stok_cookie_by_password, data=post_data_of_get_stok_cookie_by_password, headers=headers_of_get_stok_cookie_by_password) try: print(&#39;----------------------------------------正在获取cookie与stok......&#39;) resp_dict = json.loads(resp.content) self.stok = resp_dict[&#39;result&#39;][&#39;stok&#39;] # print(f&#39;resp_dict is {resp_dict}&#39;) self.cookie = resp.cookies self.cookie = str(self.cookie) # print(self.cookie) self.cookie = self.cookie.split(&#39; &#39;)[1] print("----------------------------------------得到登录的cookie与stok分别为") print(f&#39;----------------------------------------cookie:{self.cookie}&#39;) print(f&#39;----------------------------------------stok:{self.stok}\n&#39;) return [self.cookie, self.stok] except Exception as ex: self.logger.warning("样机处于非出厂设置状态,用户名密码不正确,请重新检查用户名密码或恢复出厂设置后重新实例化ERRouter_int()类") raise ex def get_uptime(self): headers_of_get_uptime = { &#39;Host&#39;: "%s" % self.ip, &#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/113.0&#39;, &#39;Accept&#39;: &#39;application/json, text/javascript, */*; q=0.01&#39;, &#39;Accept-Language&#39;: &#39;zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2&#39;, &#39;Accept-Encoding&#39;: &#39;gzip, deflate&#39;, &#39;Content-Type&#39;: &#39;application/x-www-form-urlencoded; charset=UTF-8&#39;, &#39;X-Requested-With&#39;: &#39;XMLHttpRequest&#39;, &#39;Content-Length&#39;: &#39;14&#39;, &#39;Origin&#39;: &#39;http://%s&#39; % self.ip, &#39;Connection&#39;: &#39;keep-alive&#39;, &#39;Referer&#39;: &#39;http://%s/webpages/login.html&#39; % self.ip, &#39;Pragma&#39;: &#39;no-cache&#39;, &#39;Cache-Control&#39;: &#39;no-cache&#39; } url_of_get_uptime = &#39;http://%s/cgi-bin/luci/;stok=/locale?form=lang&#39; % self.ip post_data_of_get_uptime = {"operation": "read"} req2 = requests.post(url=url_of_get_uptime, data=post_data_of_get_uptime, headers=headers_of_get_uptime) st = req2.content resp_dict = json.loads(st) if &#39;uptime&#39; in list(resp_dict[&#39;result&#39;].keys()): up_time = resp_dict[&#39;result&#39;][&#39;uptime&#39;] print(&#39;----------------------------------------获取到登录密的up_time的值为: &#39; + str(up_time)) return str(up_time) else: print(&#39;----------------------------------------该机型登录机制未时间戳&#39; ) return None def get_encrypt_password(self, up_time=None): if up_time is not None: _password_with_uptime = self.password + &#39;_&#39; + up_time else: _password_with_uptime = self.password _encrypt_password = RSAEncrypt.Encrypt(_password_with_uptime) # print(&#39;----------------------------------密后密码为&#39; + str(_encrypt_password)) return _encrypt_password def set_new_password(self): old_acc = &#39;admin&#39; old_pwd = &#39;21dd905725bef0483f91a45c954f26dd0c6640329cf266f043d8a386855b22d2e056c&#39; \ &#39;0411a8f6246fcbb8e1804a5d433a92334b312a403616eb03ac17051a3f903f39c92a7&#39; \ &#39;e512fe5b8deac4e455fbe532cd919749a75ebf8e3ed0927cf5277c2d0304478a54efa&#39; \ &#39;aa1ecd05d1b760473e6bd06734075b6040998d77ee59d87bf&#39; new_acc = &#39;admin&#39; new_pwd = RSAEncrypt.Encrypt(self.mark_password) post_data = \ { "method": "set", "params": { "old_acc": old_acc, "old_pwd": old_pwd, "new_acc": new_acc, "new_pwd": new_pwd, "cfm_pwd": new_pwd, } } data_raw = json.dumps(post_data, separators=(&#39;,&#39;, &#39;:&#39;)) post_data_of_set_new_password = {"data": data_raw} time.sleep(1) url_of_set_new_password = &#39;http://%s/cgi-bin/luci/;stok=%s/admin/administration?form=accountfirstset&#39; % ( self.ip, self.stok) headers_of_set_new_password = { "Host": "%s" % self.ip, &#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/113.0&#39;, &#39;Accept&#39;: &#39;application/json, text/javascript, */*; q=0.01&#39;, &#39;Accept-Language&#39;: &#39;zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2&#39;, &#39;Accept-Encoding&#39;: &#39;gzip, deflate&#39;, &#39;Content-Type&#39;: &#39;application/x-www-form-urlencoded; charset=UTF-8&#39;, &#39;X-Requested-With&#39;: &#39;XMLHttpRequest&#39;, &#39;Content-Length&#39;: &#39;14&#39;, "Origin": "http://%s" % self.ip, &#39;Connection&#39;: &#39;keep-alive&#39;, "Referer": "http://%s/webpages/login.html" % (self.ip), &#39;Pragma&#39;: &#39;no-cache&#39;, &#39;Cache-Control&#39;: &#39;no-cache&#39;, &#39;Cookie&#39;: &#39;%s&#39; % self.cookie } resp = requests.post(url=url_of_set_new_password, data=post_data_of_set_new_password, headers=headers_of_set_new_password) try: js = json.loads(resp.content) time.sleep(0.2) if str(js[&#39;error_code&#39;]) == &#39;0&#39;: print(&#39;----------------------------------------设置密码&#39; + self.mark_password + "成功") except Exception: self.logger.warning("设定密码时失败,请检查样机连接状态") #************************************************************************************************************************************************************************************************************************************* # ************************************************************************************************************************************************************************************************************************************* # ************************************************************************************************************************************************************************************************************************************* # ************************************************************************************************************************************************************************************************************************************* # ************************************************************************************************************************************************************************************************************************************* # def add_lan_network(self): # post_data = {"method": "add", "params": {"index": 1, "old": "add", # "new": {"default": "0", "name": "LAN2", "ipaddr": "192.168.2.1", # "netmask": "255.255.255.0", "mode": "normal", # "isolation": "off", "vlanid": "2", "igmp_snooping": "", # "dhcp_mode": "dhcp_server", "enable": "on", # "ipaddr_start": "192.168.2.100", "ipaddr_end": "192.168.2.199", # "leasetime": "120", "gateway": "", "domain": "", "pri_dns": "", # "snd_dns": "", "next_server": "", "option42": "", # "option67": "", "option2": "", "option66": "", "option252": "", # "option60": "", "option138": "", "option150": "", # "option159": "", "option160": "", "option176": "", # "option242": "", "relay_enable": "off", "dhcp_opts": []}, # "vlanid": "add"}} # self.output = self._post_model_form_data(model_name=&#39;dhcps&#39;, form_name=&#39;lan&#39;, data=post_data) # print(f&#39;{self.output}&#39;) def BasicTest_NetworkAttach(self): self.network_mode_names = { &#39;prefer_lte&#39;: &#39;4G优先&#39;, &#39;only_lte&#39;: &#39;仅4G&#39;, &#39;only_wcdma&#39;: &#39;仅3G&#39; # 后续添5G相关内容 } post_data = {"method":"get"} resp = self._post_model_form_data(model_name=&#39;network_mobile&#39;, form_name=&#39;setting&#39;, data=post_data) self.LTE_Result = rp.parse_lte_status(resp) Roaming = self.LTE_Result[&#39;数据漫游开关-data_roaming&#39;] ISP = self.LTE_Result[&#39;当前运营商-current_operator&#39;] self.preferred_network_type = self.LTE_Result[&#39;可用网络模式列表-available_network_modes&#39;] self.Default_Network_Type = self.preferred_network_type[0] self.Default_Profile_name = self.LTE_Result[&#39;配置文件名称-profile_name&#39;] print(f&#39;----------------------------------------以下是SIM1卡槽对应拨号信息,请确保SIM卡插在SIM1卡槽!!!\n{self.LTE_Result}&#39;) print(f&#39;----------------------------------------其中漫游状态:{Roaming},服务提供商:{ISP}&#39;) print(f&#39;----------------------------------------拨号成功,接下来是网络连通性测试&#39;) sf.quick_internet_test() print(&#39;\n\n\n&#39;) def BasicTest_NetworkSwitch(self): # 直接使用了BasicTest_NetworkAttach中的self.LTE_Result参数,所以再运行此用例前必须先运行BasicTest_NetworkAttach print(f&#39;----------------------------------------当前机型支持的网络模式有:{self.preferred_network_type}&#39;) default_network_mode_name = self.network_mode_names[self.Default_Network_Type] default_profile = self.Default_Profile_name print(f&#39;----------------------------------------默认网络模式为:{default_network_mode_name}&#39;) sf.quick_internet_test() print(f&#39;----------------------------------------默认Profile为:{default_profile}&#39;) for network_type in self.preferred_network_type: if network_type != self.Default_Network_Type: post_data = {"method":"set", "params":{ "dial_setting":{ "profile_id":"8", "profile_name":"China Unicom" }, "failover_timeout":"100", "network_mode":network_type, "data_roaming":False } } network_mode_name = self.network_mode_names[network_type] print(f&#39;----------------------------------------正在切换为{network_mode_name}模式&#39;) resp = self._post_model_form_data(model_name=&#39;network_mobile&#39;, form_name=&#39;setting&#39;, data=post_data) time.sleep(5) print(f&#39;----------------------------------------切换成功,正在检查在{network_mode_name}模式下的网络可达性&#39;) sf.quick_internet_test() #完成遍历后将网络模式切换回原本模式 print(f&#39;----------------------------------------BasicTest_NetworkSwitch完成!正在将网络模式切换为默认&#39;) post_data = {"method": "set", "params": { "dial_setting": { "profile_id": "8", "profile_name": self.Default_Profile_name }, "failover_timeout": "100", "network_mode": self.Default_Network_Type, "data_roaming": False } } self._post_model_form_data(model_name=&#39;network_mobile&#39;, form_name=&#39;setting&#39;, data=post_data) print(&#39;\n\n\n&#39;) def BasicTest_NetworkSearch(self): self.start_search_time = time.time() # 先开始搜索网络,再持续地检测搜索是否完成 post_data = {"method":"start"} try: resp = self._post_model_form_data(model_name=&#39;network_mobile&#39;, form_name=&#39;network_search&#39;, data=post_data) if resp.get(&#39;error_code&#39;) != &#39;0&#39;: print("----------------------------------------网络搜索失败") return False except Exception as e: print("----------------------------------------网络搜索失败 % s" % e) #method修改为get,每秒一次持续检测是否搜索成功 max_wait_time = 30 # 最大等待60秒 poll_interval = 1 # 每秒检测一次 search_success = False post_data = {"method": "get"} while not search_success and time.time() - self.start_search_time < max_wait_time: resp = self._post_model_form_data(model_name=&#39;network_mobile&#39;, form_name=&#39;network_search&#39;, data=post_data) self.search_response = rp.parse_network_search_response(resp) if self.search_response == None: time.sleep(poll_interval) else: search_success = True self.end_search_time = time.time() if not search_success: self.end_search_time = time.time() print(&#39;----------------------------------------搜索网络超时,timeout=30s&#39;) search_time = self.end_search_time - self.start_search_time print(f&#39;----------------------------------------搜索网络花费时间为{search_time}&#39;) search_result = self.search_response[&#39;运营商列表-operator_list&#39;] print(f&#39;----------------------------------------搜索到的运营商列表如下:&#39;) for operator_info in search_result: operator = operator_info.get(&#39;alpha_short&#39;) print(f&#39;----------------------------------------{operator}&#39;) print(&#39;\n\n\n&#39;) def BasicTest_BandSelect(self): self.start_search_time = time.time() post_data = {"method":"start"} #与搜索网络逻辑类似,先开始搜索Band,再持续检测搜索是否成功 try: resp = self._post_model_form_data(model_name=&#39;network_mobile&#39;, form_name=&#39;band_search&#39;, data=post_data) if resp.get(&#39;error_code&#39;) != &#39;0&#39;: print("----------------------------------------Band搜索失败") return False except Exception as e: print("----------------------------------------Band搜索失败 % s" % e) #method修改为get,每秒一次持续检测是否搜索成功 max_wait_time = 30 # 最大等待60秒 poll_interval = 1 # 每秒检测一次 search_success = False post_data = {"method": "get"} while not search_success and time.time() - self.start_search_time < max_wait_time: resp = self._post_model_form_data(model_name=&#39;network_mobile&#39;, form_name=&#39;band_search&#39;, data=post_data) self.search_response = rp.parse_band_search_response(resp) if self.search_response == None: time.sleep(poll_interval) else: search_success = True self.end_search_time = time.time() if not search_success: self.end_search_time = time.time() print(&#39;----------------------------------------搜索网络超时,timeout=30s&#39;) search_time = self.end_search_time - self.start_search_time print(f&#39;----------------------------------------搜索网络花费时间为{search_time}&#39;) print(f&#39;----------------------------------------搜索到的Band列表如下:&#39;) isp = self.search_response[&#39;运营商-isp&#39;] search_result = self.search_response[&#39;Band列表-searched_list&#39;] for band_info in search_result: belong_to_isp = band_info.get(&#39;belong_to_isp&#39;) band = band_info.get(&#39;band&#39;) if belong_to_isp: print(f&#39;----------------------------------------Band:{band},属于运营商{isp}&#39;) else: print(f&#39;----------------------------------------Band:{band},不属于任何运营商&#39;) #搜索Band成功后,遍历每一个Band检查网络连通性 for band_info in search_result: belong_to_isp = band_info.get(&#39;belong_to_isp&#39;) band = band_info.get(&#39;band&#39;) if belong_to_isp: print(f&#39;----------------------------------------正在选择Band: {band},属于运营商{isp},检测网络连通信中&#39;) post_data = {"method":"set","params":{"auto":False,"selected_list":[{"band":band,"belong_to_isp":True}]}} self._post_model_form_data(model_name=&#39;network_mobile&#39;, form_name=&#39;band_search&#39;, data=post_data) time.sleep(60) sf.quick_internet_test() else: print(f&#39;----------------------------------------正在选择Band: {band},不属于任何运营商,检测网络连通信中&#39;) post_data = {"method":"set","params":{"auto":False,"selected_list":[{"band":band,"belong_to_isp":False}]}} self._post_model_form_data(model_name=&#39;network_mobile&#39;, form_name=&#39;band_search&#39;, data=post_data) time.sleep(60) sf.quick_internet_test() #遍历完成后将Band模式切换回Auto,检查是否支持连接到2CA网络 print(f&#39;----------------------------------------遍历Band完成!!!正在将Band模式切换回Auto,检查是否支持连接到2CA网络&#39;) post_data = {"method":"set","params":{"auto":True}} self._post_model_form_data(model_name=&#39;network_mobile&#39;, form_name=&#39;band_search&#39;, data=post_data) time.sleep(60) post_data = {"method": "get"} resp = self._post_model_form_data(model_name=&#39;network_mobile&#39;, form_name=&#39;cellular_info&#39;, data=post_data) systemstatus_ltewan = rp.parse_systemstatus_ltewan(resp) print(f&#39;----------------------------------------LTE WAN口信息如下\n{systemstatus_ltewan}&#39;) auto_band_list = systemstatus_ltewan.get(&#39;频段-band&#39;) band_num = len(auto_band_list) if band_num == 1: print(f&#39;----------------------------------------Band数量为1,当前网络环境不支持2CA网络&#39;) elif band_num > 1: print(f&#39;----------------------------------------Band数量 > 1,当前网络环境支持2CA网络&#39;) def IPV6andIPv4_IPV4andIPV6(self): post_data = {"method":"get"} resp = self._post_model_form_data(model_name=&#39;network_mobile&#39;, form_name=&#39;setting&#39;, data=post_data) default_profile = rp.parse_lte_status(resp) preferred_network_type = default_profile[&#39;可用网络模式列表-available_network_modes&#39;] Default_Network_Type = preferred_network_type[0] Default_Profile_name = default_profile[&#39;配置文件名称-profile_name&#39;] print(f&#39;----------------------------------------默认网络模式为:{self.network_mode_names[Default_Network_Type]}&#39;) print(f&#39;----------------------------------------默认Profile为:{Default_Profile_name}&#39;) # 新建profile1,PDP type选择IPV4&IPV6,其他配置与默认profile保持一致才能保证拨号成功,新建完成后会自动将当前profile切换为新建profile;并且新建profile1成功后,需要记录下profile1的id,方便之后进行profile切换 post_data = {"method":"add", "params":{ "profile_name":"profile1", "pdp_type":"dual", "apn_type":default_profile[&#39;APN类型-apn_type&#39;], "apn":default_profile[&#39;APN-apn&#39;], "username":"", "password":"", "authentication_type":default_profile[&#39;认证类型-authentication_type&#39;] } } new_profile1_resp = self._post_model_form_data(model_name=&#39;network_mobile&#39;, form_name=&#39;isp_profile_list&#39;, data=post_data) time.sleep(3) self.profile1_id = rp.parse_profile_id(new_profile1_resp) # # 开启DUT LAN侧的IPv6,便于其给PC分配IPv6地址来测试IPv6可用性。 post_data = {"method":"set","params":{"index":0,"old":{"name":"LAN","vlanid":"1","proto":"slaac","slaac_type":"delegation","slaac_zone":"WAN7","slaac_prefixid":"0","slaac_dns":"auto","slaac_address":"2408:8469:ff90:70fc:21d:fff:fe00:2284/64","address":"2408:8469:ff90:70fc:21d:fff:fe00:2284/64","ra_status":"on","ra_priority":"medium","ra_valid_lifetime":"86400","ra_prefer_lifetime":"14400"},"new":{"vlanid":"1","proto":"slaac","slaac_type":"delegation","slaac_zone":"WAN7","slaac_addr_prefix":"","slaac_dns":"auto","slaac_address":"2408:8469:ff90:70fc:21d:fff:fe00:2284/64","ra_status":"on","ra_priority":"medium","ra_valid_lifetime":"86400","ra_prefer_lifetime":"14400"},"key":"key-2"}} self._post_model_form_data(model_name=&#39;ipv6&#39;, form_name=&#39;lan_ipv6&#39;, data=post_data) print(f&#39;----------------------------------------正在默认网络模式{self.network_mode_names[Default_Network_Type]}下进行网络测试&#39;) # sf.quick_internet_test() # sf.quick_ipv6_test() for network_type in preferred_network_type: if network_type != Default_Network_Type: post_data = {"method":"set", "params":{ "dial_setting":{ "profile_id": self.profile1_id, "profile_name":"profile1" }, "failover_timeout":"100", "network_mode":network_type, "data_roaming":False } } network_mode_name = self.network_mode_names[network_type] print(f&#39;----------------------------------------正在切换为{network_mode_name}模式&#39;) resp = self._post_model_form_data(model_name=&#39;network_mobile&#39;, form_name=&#39;setting&#39;, data=post_data) time.sleep(20) print(f&#39;----------------------------------------切换成功,正在检查在{network_mode_name}模式下的网络可达性&#39;) # sf.quick_internet_test() # sf.quick_ipv6_test() # 遍历网络模式完成,将网络模式切换为默认并将拨号profile切换为初始profile print(f&#39;----------------------------------------正在切换为默认网络模式:{Default_Network_Type}和默认profile:{Default_Profile_name}&#39;) post_data = {"method":"set", "params":{ "profile_id":default_profile[&#39;配置文件id-profile_id&#39;], "profile_name":default_profile[&#39;配置文件名称-profile_name&#39;], "pdp_type":default_profile[&#39;PDP类型-pdp_type&#39;], "apn_type":default_profile[&#39;APN类型-apn_type&#39;], "apn":default_profile[&#39;APN-apn&#39;], "username":"", "password":"", "authentication_type":default_profile[&#39;认证类型-authentication_type&#39;], } } self._post_model_form_data(model_name=&#39;network_mobile&#39;, form_name=&#39;isp_profile_list&#39;, data=post_data) time.sleep(3) post_data = {"method": "set", "params": { "dial_setting": { "profile_id": default_profile[&#39;配置文件id-profile_id&#39;], "profile_name": default_profile[&#39;配置文件名称-profile_name&#39;] }, "failover_timeout": "100", "network_mode": Default_Network_Type, "data_roaming": False } } self._post_model_form_data(model_name=&#39;network_mobile&#39;, form_name=&#39;setting&#39;, data=post_data) time.sleep(3) def IPV6andIPv4_IPv6Only(self): post_data = {"method": "get"} resp = self._post_model_form_data(model_name=&#39;network_mobile&#39;, form_name=&#39;setting&#39;, data=post_data) default_profile = rp.parse_lte_status(resp) preferred_network_type = default_profile[&#39;可用网络模式列表-available_network_modes&#39;] Default_Network_Type = preferred_network_type[0] Default_Profile_name = default_profile[&#39;配置文件名称-profile_name&#39;] print(f&#39;----------------------------------------默认网络模式为:{self.network_mode_names[Default_Network_Type]}&#39;) print(f&#39;----------------------------------------默认Profile为:{Default_Profile_name}&#39;) # 新建profile2,PDP type选择IPV6,其他配置与默认profile保持一致才能保证拨号成功,新建完成后会自动将当前profile切换为新建profile;并且新建profile2成功后,需要记录下profile2的id,方便之后进行profile切换 post_data = {"method": "add", "params": { "profile_name": "profile2", "pdp_type": "ipv6", "apn_type": default_profile[&#39;APN类型-apn_type&#39;], "apn": default_profile[&#39;APN-apn&#39;], "username": "", "password": "", "authentication_type": default_profile[&#39;认证类型-authentication_type&#39;] } } new_profile2_resp = self._post_model_form_data(model_name=&#39;network_mobile&#39;, form_name=&#39;isp_profile_list&#39;, data=post_data) time.sleep(3) self.profile2_id = rp.parse_profile_id(new_profile2_resp) # 在3.1测试中已经开启DUT LAN侧的IPv6给PC分配IPv6地址来测试IPv6可用性,故此处无需重复操作 # post_data = {"method": "set", "params": {"index": 0, "old": {"name": "LAN", "vlanid": "1", "proto": "slaac", # "slaac_type": "delegation", "slaac_zone": "WAN7", # "slaac_prefixid": "0", "slaac_dns": "auto", # "slaac_address": "2408:8469:ff90:70fc:21d:fff:fe00:2284/64", # "address": "2408:8469:ff90:70fc:21d:fff:fe00:2284/64", # "ra_status": "on", "ra_priority": "medium", # "ra_valid_lifetime": "86400", # "ra_prefer_lifetime": "14400"}, # "new": {"vlanid": "1", "proto": "slaac", "slaac_type": "delegation", # "slaac_zone": "WAN7", "slaac_addr_prefix": "", # "slaac_dns": "auto", # "slaac_address": "2408:8469:ff90:70fc:21d:fff:fe00:2284/64", # "ra_status": "on", "ra_priority": "medium", # "ra_valid_lifetime": "86400", "ra_prefer_lifetime": "14400"}, # "key": "key-2"}} # self._post_model_form_data(model_name=&#39;ipv6&#39;, form_name=&#39;lan_ipv6&#39;, data=post_data) print( f&#39;----------------------------------------正在默认网络模式{self.network_mode_names[Default_Network_Type]}下进行网络测试&#39;) # sf.quick_internet_test() # sf.quick_ipv6_test() for network_type in preferred_network_type: if network_type != Default_Network_Type: post_data = {"method": "set", "params": { "dial_setting": { "profile_id": self.profile2_id, "profile_name": "profile2" }, "failover_timeout": "100", "network_mode": network_type, "data_roaming": False } } network_mode_name = self.network_mode_names[network_type] print(f&#39;----------------------------------------正在切换为{network_mode_name}模式&#39;) resp = self._post_model_form_data(model_name=&#39;network_mobile&#39;, form_name=&#39;setting&#39;, data=post_data) time.sleep(20) print( f&#39;----------------------------------------切换成功,正在检查在{network_mode_name}模式下的网络可达性&#39;) # sf.quick_internet_test() # sf.quick_ipv6_test() # 遍历网络模式完成,将网络模式切换为默认并将拨号profile切换为初始profile print(f&#39;----------------------------------------正在切换为默认网络模式:{Default_Network_Type}和默认profile:{Default_Profile_name}&#39;) post_data = {"method": "set", "params": { "profile_id": default_profile[&#39;配置文件id-profile_id&#39;], "profile_name": default_profile[&#39;配置文件名称-profile_name&#39;], "pdp_type": default_profile[&#39;PDP类型-pdp_type&#39;], "apn_type": default_profile[&#39;APN类型-apn_type&#39;], "apn": default_profile[&#39;APN-apn&#39;], "username": "", "password": "", "authentication_type": default_profile[&#39;认证类型-authentication_type&#39;], } } self._post_model_form_data(model_name=&#39;network_mobile&#39;, form_name=&#39;isp_profile_list&#39;, data=post_data) time.sleep(3) post_data = {"method": "set", "params": { "dial_setting": { "profile_id": default_profile[&#39;配置文件id-profile_id&#39;], "profile_name": default_profile[&#39;配置文件名称-profile_name&#39;] }, "failover_timeout": "100", "network_mode": Default_Network_Type, "data_roaming": False } } self._post_model_form_data(model_name=&#39;network_mobile&#39;, form_name=&#39;setting&#39;, data=post_data) time.sleep(3) def IPV6andIPv4_SwitchProfile(self): post_data = {"method": "get"} resp = self._post_model_form_data(model_name=&#39;network_mobile&#39;, form_name=&#39;setting&#39;, data=post_data) default_profile = rp.parse_lte_status(resp) preferred_network_type = default_profile[&#39;可用网络模式列表-available_network_modes&#39;] Default_Network_Type = preferred_network_type[0] Default_Profile_name = default_profile[&#39;配置文件名称-profile_name&#39;] print(f&#39;----------------------------------------默认网络模式为:{self.network_mode_names[Default_Network_Type]}&#39;) print(f&#39;----------------------------------------默认Profile为:{Default_Profile_name}&#39;) profile_sequence = [ (default_profile[&#39;配置文件名称-profile_name&#39;], default_profile[&#39;配置文件id-profile_id&#39;]), (&#39;Profile1&#39;, self.profile1_id), (&#39;Profile2&#39;, self.profile2_id), (&#39;Profile1&#39;, self.profile1_id), (default_profile[&#39;配置文件名称-profile_name&#39;], default_profile[&#39;配置文件id-profile_id&#39;]), (&#39;Profile2&#39;, self.profile2_id), (default_profile[&#39;配置文件名称-profile_name&#39;], default_profile[&#39;配置文件id-profile_id&#39;]) ] for profile_name , profile_id in profile_sequence: print(f&#39;----------------------------------------profile正在切换为:{profile_name},其id是{profile_id}&#39;) post_data = {"method": "set", "params": { "profile_id": profile_id, "profile_name": profile_name, "pdp_type": default_profile[&#39;PDP类型-pdp_type&#39;], "apn_type": default_profile[&#39;APN类型-apn_type&#39;], "apn": default_profile[&#39;APN-apn&#39;], "username": "", "password": "", "authentication_type": default_profile[&#39;认证类型-authentication_type&#39;], } } self._post_model_form_data(model_name=&#39;network_mobile&#39;, form_name=&#39;isp_profile_list&#39;, data=post_data) time.sleep(3) post_data = {"method": "set", "params": { "dial_setting": { "profile_id": profile_id, "profile_name": profile_name }, "failover_timeout": "100", "network_mode": &#39;prefer_lte&#39;, "data_roaming": False } } self._post_model_form_data(model_name=&#39;network_mobile&#39;, form_name=&#39;setting&#39;, data=post_data) time.sleep(3) print(f&#39;----------------------------------------profile切换为:{profile_name}成功!正在检测网络环境&#39;) def Performance_4GPerformance(self): post_data = {"method": "get"} resp = self._post_model_form_data(model_name=&#39;network_mobile&#39;, form_name=&#39;setting&#39;, data=post_data) default_profile = rp.parse_lte_status(resp) # 先将网络模式设置为仅4G post_data = {"method": "set", "params": { "dial_setting": { "profile_id": default_profile[&#39;配置文件id-profile_id&#39;], "profile_name": default_profile[&#39;配置文件名称-profile_name&#39;] }, "failover_timeout": "100", "network_mode": &#39;only_lte&#39;, "data_roaming": False } } self._post_model_form_data(model_name=&#39;network_mobile&#39;, form_name=&#39;setting&#39;, data=post_data) time.sleep(3) speedtest_test_result = sf.basic_speedtest() self.test_results.append({ &#39;case_name&#39;: &#39;Performance_4GPerformance&#39;, &#39;result&#39;: &#39;Ref&#39;, &#39;remarks&#39;: speedtest_test_result }) def export_results_to_excel(self, filename=None): """导出测试结果到Excel""" if filename is None: filename = f"test_results_{time.time()}.xlsx" exporter = eo.TestResultExporter(filename) exporter.export_from_dut(self) return filename
10-24
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值