中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

模板網(wǎng)站建設(shè)咨詢百度網(wǎng)頁版首頁

模板網(wǎng)站建設(shè)咨詢,百度網(wǎng)頁版首頁,軟件銷售網(wǎng)站模板,博彩網(wǎng)站開發(fā)建設(shè)0.前言 此框架為真實(shí)項(xiàng)目實(shí)戰(zhàn),所以有些數(shù)據(jù)不便展示,只展示架構(gòu)和思想 工具:pythonseleniumddtunittest 1.架構(gòu)說明 2.代碼封裝 Commom層 base_page.py #__author__19044168 #date2021/8/26 import logging import datetime from sele…

0.前言

此框架為真實(shí)項(xiàng)目實(shí)戰(zhàn),所以有些數(shù)據(jù)不便展示,只展示架構(gòu)和思想

工具:python+selenium+ddt+unittest

1.架構(gòu)說明

2.代碼封裝?

Commom層

base_page.py
#__author__=19044168
#date=2021/8/26
import logging
import datetime
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import time
from Common import dir_configfrom Common.logger import GetLogger
logger = GetLogger.get_logger()#1.封裝基本函數(shù),執(zhí)行日志,異常處理,失敗截圖
#2.所有的頁面公共行為,非業(yè)務(wù)層面的行為
class BasePage:def __init__(self,driver):self.driver = driver#等待元素可見def wait_eleVisible(self,locator,wait_times=30,poll_frequency=0.5,doc=""):""":param locator: 元素定位元組形式(定位類型,定位方式):param times::param poll_frequency::param doc: 模塊名_頁面名_操作名:return: None"""logger.info("等待元素{0}可見".format(locator))try:#開始等待時(shí)間start = datetime.datetime.now().timestamp()#轉(zhuǎn)化為sWebDriverWait(self.driver,wait_times,poll_frequency).until(EC.visibility_of_element_located(locator))# 結(jié)束等待時(shí)間end = datetime.datetime.now().timestamp()#求一個(gè)時(shí)間差值寫到日志中sub_time = end - startlogger.info("等待時(shí)長為:{}".format(sub_time))# self.save_screenshot(doc)except:logger.exception('等待元素可見失敗!!!')#截圖操作self.save_screenshot(doc)raise#待元素不可見def wait_eleNotVisible(self,locator,wait_times=30,poll_frequency=0.5,doc=""):""":param locator: 元素定位元組形式(定位類型,定位方式):param times::param poll_frequency::param doc: 模塊名_頁面名_操作名:return: None"""logger.info("{0}等待元素{1}不可見".format(doc,locator))try:# 開始等待時(shí)間start = datetime.datetime.now()  # 轉(zhuǎn)化為sWebDriverWait(self.driver,wait_times, poll_frequency).until(EC.invisibility_of_element_located(locator))# 結(jié)束等待時(shí)間end = datetime.datetime.now()# 求一個(gè)時(shí)間差值,寫到日志中wait_time = (end - start).secondslogger.info("{0}:元素{1}已可見,等待起始時(shí)間:{2},等待結(jié)束時(shí)間:{3},等待時(shí)長為:{4}".format(doc,locator,start,end,wait_time))# self.save_screenshot(doc)except:logger.exception('等待元素不可見失敗!!!')# 截圖操作self.save_screenshot(doc)raise#等待元素存在def wait_elePresence(self,locator,wait_times=30,poll_frequency=0.5,doc=""):logger.info("等待元素{0}存在".format(locator))try:# 開始等待時(shí)間start = datetime.datetime.now().timestamp()  # 轉(zhuǎn)化為sWebDriverWait(self.driver, wait_times, poll_frequency).until(EC.presence_of_element_located(locator))# 結(jié)束等待時(shí)間end = datetime.datetime.now().timestamp()# 求一個(gè)時(shí)間差值寫到日志中sub_time = end - startlogger.info("等待時(shí)長為:{}".format(sub_time))# self.save_screenshot(doc)except:logger.exception('等待元素存在失敗!!!')# 截圖操作self.save_screenshot(doc)raise#查找元素def get_element(self,locator,doc=""):logger.info('{0}查找元素:{1}'.format(doc,locator))try:return self.driver.find_element(*locator)except:logger.exception("查找元素失敗!!!")# 截圖操作self.save_screenshot(doc)raise#點(diǎn)擊操作def click_elemnet(self,locator,doc=""):#找元素ele = self.get_element(locator,doc)logger.info("{0}點(diǎn)擊元素:{1}".format(doc,locator))#元素操作try:ele.click()except:logger.exception("點(diǎn)擊元素失敗!!!")# 截圖操作self.save_screenshot(doc)raise#輸入操作def input_text(self,locator,text,doc=""):# 找元素ele = self.get_element(locator,doc)logger.info("{0}輸入元素{1}".format(doc,locator))try:ele.send_keys(text)except:logger.exception("輸入元素失敗!!!")# 截圖操作self.save_screenshot(doc)raise#獲取元素文本內(nèi)容def get_text(self,locator,doc=""):ele = self.get_element(locator,doc)logger.info("{0}獲取文本內(nèi)容{1}".format(doc,locator))try:return ele.textexcept:logger.exception("獲取文本內(nèi)容失敗!!!")# 截圖操作self.save_screenshot(doc)raise#獲取元素屬性def get_element_attribute(self,locator,attr,doc=""):ele = self.get_element(locator, doc)logger.info("{0}獲取元素{1}的{2}屬性的值".format(doc,locator,attr))try:return ele.get_attribute(attr)except:logger.exception("獲取元素屬性失敗!!!")# 截圖操作self.save_screenshot(doc)raise# 獲取所有句柄def get_handles(self,doc):logger.info("獲取所有頁面句柄")try:return self.driver.window_handlesexcept:logger.exception("獲取所有頁面句柄失敗!!!")# 截圖操作self.save_screenshot(doc)raise# 獲取當(dāng)前句柄def get_current_handle(self, doc):logger.info("獲取當(dāng)前{}頁面句柄".format(doc))try:return self.driver.current_window_handleexcept:logger.exception("獲取獲取當(dāng)前頁面句柄失敗!!!")# 截圖操作self.save_screenshot(doc)raise# 窗口切換def switch_window(self,handle,doc):logger.info("從當(dāng)前窗口{}切換到指定窗口".format(doc))try:self.driver.switch_to.window(handle)except:logger.exception("切換窗口失敗")self.save_screenshot(doc)raise#獲取當(dāng)前urldef get_current_url(self,doc):logger.info("獲取當(dāng)前頁面{}url".format(doc))try:return self.driver.current_urlexcept:logger.exception("獲取當(dāng)前頁面url失敗")self.save_screenshot(doc)raise#移動(dòng)到元素def move_to_element(self,target,doc):logger.info("{0},移動(dòng)元素到{1}".format(doc,target))try:ActionChains(self.driver).move_to_element(target).perform()except:logger.exception("移動(dòng)元素失敗")self.save_screenshot(doc)raise#alert處理def alert_action(self,action='accept'):pass#iframe切換def switch_iframe(self,iframe_reference):pass#上傳操作def upload_file(self):pass#截圖操作def save_screenshot(self,doc):#圖片名稱:模塊名_頁面名_操作名_年-月-日-時(shí)-分-秒.png# now = datetime.datetime.now()# format_time = now.strftime("%Y-%m-%d-%H-%M-%S")# filename =  'OutPuts/screenshots/' + "{0}_{1}.png".format(name,format_time)# self.driver.save_screenshot(filename)# logging.info('截取網(wǎng)頁成功,文件路徑為{}'.format(filename))filePath = dir_config.screenshot_dir  + '/'+ '{0}_{1}.png'.format(doc,time.strftime("%Y-%m-%d-%H-%M-%S",time.localtime()))try:self.driver.save_screenshot(filePath)logger.info("截屏成功,截屏路徑為{0}".format(filePath))except:logger.exception('截屏失敗!!')raise#滾動(dòng)條操作...if __name__ == '__main__':pass

dir_config.py

email_fundation.py
#__author__=19044168
#date=2021/8/13
import smtplib
from email.mime.text import MIMEText#這是發(fā)正文
from email.mime.multipart import MIMEMultipart#這是發(fā)附件
import osclass Email:def __init__(self):self.send_user = 'xx@xxing.com'self.receive_user = 'yy@yying.com'# global user_listself.user_list = ['xx@xxing.com','ss4@ssing.com']self.server_host = 'smtp.suning.com'self.username = 'dfdds@ddning.com'self.password = 'dfsdfsdfsd'def sendEmail(self,new_file):f = open(new_file,'rb')mail_body = f.read()f.close()msg = MIMEMultipart('mixed')html_file = MIMEText(mail_body,'html','utf-8')# msg = MIMEMultipart(mail_body,'html','utf-8')msg['Subject'] = "Hbase WebAutoTest Report"context = MIMEText('<html><h2>您好,這是Hbase服務(wù)化測(cè)試報(bào)告</h2></html>', 'html', 'utf-8')msg.attach(context)msg.attach(html_file)# 發(fā)動(dòng)郵件server = smtplib.SMTP()server.connect(self.server_host)server.login(self.username, self.password)# server.sendmail(self.send_user, self.receive_user, msg.as_string())server.sendmail(self.send_user, self.user_list, msg.as_string())server.close()def new_report(self,reportpath):lists = os.listdir(reportpath)lists.sort(key=lambda fn:os.path.getmtime((reportpath + '/' + fn)))print(lists)new_file = os.path.join(reportpath,lists[-1])print(new_file)return  new_file
e = Email()if __name__ == '__main__':print(os.getcwd())e = Email()test_report = '../OutPuts/reports'new_report = e.new_report(test_report)e.sendEmail(new_report)

logger.py

#__author__=19044168
#date=2021/8/27
import logging.handlers
import time
from Common.dir_config import logs_dirclass GetLogger():logger = None@classmethoddef get_logger(cls):if cls.logger == None:# 日志器實(shí)例cls.logger = logging.getLogger()# 設(shè)置日志級(jí)別cls.logger .setLevel(level=logging.INFO)# 控制臺(tái)處理器實(shí)例ch = logging.StreamHandler()# 以時(shí)間切分日志文件處理器filename = logs_dir + '/' + time.strftime('%Y-%m-%d-%H-%M-%S') + '_WebUiTestLog.log'th = logging.handlers.TimedRotatingFileHandler(filename=filename,encoding='utf-8')# 設(shè)置日志格式fmt = "%(asctime)s %(levelname)s [%(name)s] [filename: %(filename)s - module: %(module)s - func: %(funcName)s  %(lineno)d line] - %(message)s"fm = logging.Formatter(fmt)# 將日志格式添加到處理器ch.setFormatter(fm)th.setFormatter(fm)# 將處理器添加到日志器cls.logger .addHandler(ch)cls.logger .addHandler(th)return cls.loggerif __name__ == '__main__':print(time.strftime())

OutPuts層,不需要封裝,代碼定義好目錄即可

PageLocators層,根據(jù)頁面層次進(jìn)行組織

loginpage_locators.py,登錄頁面

?其他頁面自行封裝

PageObjects層,根據(jù)頁面層次進(jìn)行組織

login_page.py,登錄頁面
#__author__=19044168
#date=2021/8/19
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from PagesObjects.index_page import IndexPage
from PageLocators.loginpage_locators import LoginPageLocator as loc #直接用,不要繼承,不然對(duì)象可選方法變量太多
from time import sleepfrom Common.logger import GetLogger
logger = GetLogger.get_logger()from Common.base_page import BasePageclass LoginPage(BasePage):# #用戶名輸入框# username_loc = (By.XPATH,'//input[@id="userId"]')# #密碼輸入框# password_loc = (By.XPATH,'//input[@id="password"]')# #登錄按鈕# login_loc = (By.XPATH,'//a[@id="submit_btn"]')# #是否記住密碼勾選框# remember_loc = (By.XPATH,'//input[@id="remember"]')# #登錄入口鏈接# enter_loc = (By.XPATH,'//a[@class="btn-login"]')# #用戶名格式錯(cuò)誤驗(yàn)證文本# errorMsg_from_wrongUser = (By.XPATH,'//div[@class="layui-layer-content"]')# #賬號(hào)密碼錯(cuò)誤提示文本# msg_loc = (By.XPATH,'//div[@id ="error"]')# def __init__(self,driver):#     self.driver = driver#登錄入口def login_enter(self):doc = '登錄地址入口頁面_登錄跳轉(zhuǎn)功能'self.wait_eleVisible(loc.enter_loc,doc=doc)self.click_elemnet(loc.enter_loc,doc=doc)# enter_loc = '//a[@class="btn-login"]'# WebDriverWait(self.driver,10).until(EC.visibility_of_element_located(loc.enter_loc))# self.driver.find_element_by_xpath(enter_loc).click()# self.driver.find_element(*self.enter_loc).click()#解包元組# self.driver.find_element(*loc.enter_loc).click()#解包元組#登錄頁面def login(self,username,password,is_remember=False):# 這些元素屬性可以定義成類的屬性,最好注釋說明。但是有弊端,因?yàn)槎ㄎ环绞讲恢挂环N,修改定位就要修改元素操作方式# 不方便優(yōu)化# username_loc = '//input[@id="userId"]'# password_loc = '//input[@id="password"]'# login_loc = '//a[@id="submit_btn"]'# remember_loc = '//input[@id="remember"]'# WebDriverWait(self.driver,10).until(EC.visibility_of_element_located(loc.username_loc))doc = "登錄頁面_登錄功能"self.wait_eleVisible(loc.username_loc,doc=doc)self.input_text(loc.username_loc,username,doc=doc)self.input_text(loc.password_loc,password,doc=doc)# self.driver.find_element(*loc.username_loc).send_keys(username)# self.driver.find_element(*loc.password_loc).send_keys(password)#is_remember來判斷是否需要記住賬號(hào)密碼if is_remember:# self.driver.find_element(*loc.remember_loc).click()self.click_elemnet(loc.remember_loc,doc=doc)else:pass# self.driver.find_element(*loc.login_loc).click()self.click_elemnet(loc.login_loc,doc=doc)#獲取賬號(hào)格式錯(cuò)誤信息def get_errorMsg_from_wrongUser(self):# ret = self.driver.find_element(*loc.errorMsg_from_wrongUser)doc = "登錄頁面_賬號(hào)格式錯(cuò)誤信息"ret = self.get_text(loc.errorMsg_from_wrongUser,doc=doc)return ret#獲取賬號(hào)或者密碼錯(cuò)誤def get_errorMsg_from_pageCenter(self):doc = "登錄頁面_賬號(hào)格式錯(cuò)誤信息"self.wait_eleVisible(loc.msg_loc,doc=doc)# WebDriverWait(self.driver,10).until(EC.visibility_of_element_located(loc.msg_loc))ret = self.get_text(loc.msg_loc,doc=doc)return ret#幫助鏈接頁面def help_link(self):current_handle = self.get_current_handle(doc="登錄頁面句柄")#其實(shí)也可以在base_page封裝doc = "登錄頁面_幫助鏈接功能"self.wait_eleVisible(loc.help_link_loc,doc=doc)self.click_elemnet(loc.help_link_loc,doc=doc)handle = self.get_handles(doc="獲取所有頁面句柄")[-1]self.switch_window(handle,doc="幫助鏈接頁面")#其實(shí)也可以在base_page封裝help_url = self.get_current_url(doc='幫助鏈接頁面')self.switch_window(current_handle,doc='登錄頁面')#其實(shí)也可以在base_page封裝return help_url# 忘記密碼鏈接頁面def forget_pwd_link(self):current_handle = self.get_current_handle(doc="登錄頁面的句柄")#其實(shí)也可以在base_page封裝doc = "登錄頁面_忘記密碼鏈接功能"self.wait_eleVisible(loc.forget_pwd_link_loc,doc=doc)self.click_elemnet(loc.forget_pwd_link_loc,doc=doc)self.switch_window(self.get_handles(doc='獲取所有頁面句柄')[-1],doc='忘記密碼鏈接頁面')#其實(shí)也可以在base_page封裝forget_pwd_url = self.get_current_url(doc='忘記密碼鏈接url')#其實(shí)也可以在base_page封裝self.switch_window(current_handle,doc='登錄頁面')#其實(shí)也可以在base_page封裝return forget_pwd_urlif __name__ == '__main__':from selenium import webdriverfrom time import sleepfrom selenium.webdriver.common.action_chains import ActionChainsdriver = webdriver.Chrome()driver.maximize_window()driver.get('http://datakingdom.cnsuning.com/')lg = LoginPage(driver)ip = IndexPage(driver)lg.login_enter()# print(lg.help_link())# print(lg.forget_pwd_link())# lg.login_redirect()lg.login('19044168','19044168')sleep(1)driver.find_element_by_link_text('控制臺(tái)').click()sleep(1)driver.find_element_by_xpath('//div[contains(text(),"平臺(tái)基礎(chǔ)服務(wù)")]').click()driver.find_element_by_css_selector('ul[role="menubar"] > li:nth-child(4) > ul > li:nth-child(1)').click()sleep(1)driver.find_element_by_xpath('//tr[2]//a').click()driver.find_element_by_xpath('//ul[@x-placement="bottom-end"]/li[contains(text(),"進(jìn)入雨花prd環(huán)境")]').click()sleep(3)# print(lg.get_errorMsg_from_pageCenter())# target = driver.find_element_by_xpath('//div[@class="user-info"]')# ActionChains(driver).move_to_element(target).perform()# a = driver.find_element_by_link_text('退出')# print(a.text)# ip.isExist_logout_ele()driver.quit()

TestCases層

#__author__=19044168
#date=2021/8/20
from selenium import webdriver
import time
from PagesObjects.login_page import LoginPage
from PagesObjects.index_page import IndexPage
import unittest
from TestDatas import Common_Datas as CD
from TestDatas import Login_Datas as LD
import ddtfrom Common.logger import GetLogger
logger = GetLogger.get_logger()@ddt.ddt
class TestLogin(unittest.TestCase):@classmethoddef setUpClass(cls):logger.info("======整個(gè)用例前置:打開瀏覽器,只執(zhí)行一次=======")#通過excel獲取本功能當(dāng)中所需要的測(cè)試數(shù)據(jù),但是比較麻煩。建議使用python文件保存測(cè)試數(shù)據(jù)cls.driver = webdriver.Chrome()cls.driver.maximize_window()cls.driver.get(CD.web_login_url)cls.lg = LoginPage(cls.driver)cls.lg.login_enter()#將該步驟提前到初始化步驟中,節(jié)省時(shí)間# cls.driver.save_screenshot()@classmethoddef tearDownClass(cls):logger.info("=======整個(gè)用例后置:關(guān)閉瀏覽器,只執(zhí)行一次=======")cls.driver.quit()#每個(gè)案例執(zhí)行后進(jìn)行頁面刷新def tearDown(self):logger.info("=======每個(gè)用例后置:刷新一次頁面======")self.driver.refresh()time.sleep(0.5)def test05_login_success(self):# self.lg.login_enter()#將該步驟提前到初始化步驟中,節(jié)省時(shí)間logger.info("=======登錄用例:正常場(chǎng)景->登陸成功======")self.lg.login(LD.success_data['user'],LD.success_data['passwd'])self.assertTrue(IndexPage(self.driver).isExist_logout_ele(),'退出元素未出現(xiàn)')#異常用例--賬號(hào)格式不正確(大于8位,小于8位,等于8位且包含非數(shù)字)#ddt,步驟斷言都一致,只有文本內(nèi)容不一致@ddt.data(*LD.user_data)def test01_login_wrongUserFormat(self,data):# self.lg.login_enter()#將該步驟提前到初始化步驟中,節(jié)省時(shí)間logger.info("=======登錄用例:異常場(chǎng)景->賬號(hào)格式錯(cuò)誤,登陸失敗======")self.lg.login(data['user'], data['passwd'])self.assertEqual(self.lg.get_errorMsg_from_wrongUser(),data['check'], '賬號(hào)格式錯(cuò)誤提示信息不對(duì)')# 異常用例--用戶名或者密碼錯(cuò)誤@ddt.data(*LD.user_pwd_data)def test02_login_wrongUserOrPwd(self,data):# self.lg.login_enter()#將該步驟提前到初始化步驟中,節(jié)省時(shí)間logger.info("=======登錄用例:異常場(chǎng)景->用戶名或者密碼錯(cuò)誤,登陸失敗======")self.lg.login(data['user'],data['passwd'])self.assertEqual(self.lg.get_errorMsg_from_pageCenter(),data['check'],'非用戶名或密碼錯(cuò)誤')#幫助鏈接驗(yàn)證用例def test03_help_link(self):logger.info("=======登錄幫鏈接用例:正常場(chǎng)景->幫助鏈接有效======")self.assertIn(LD.help_url,self.lg.help_link(),'幫助鏈接地址不包含在內(nèi)')# 忘記密碼鏈接驗(yàn)證用例def test04_forget_pwd_link(self):logger.info("=======登錄忘記密碼幫鏈接用例:正常場(chǎng)景->忘記密碼鏈接有效======")self.assertIn(LD.forget_pwd_url,self.lg.forget_pwd_link(),'忘記密碼鏈接地址不包含在內(nèi)')if __name__ == '__main__':unittest.main()

?TestDatas層

run.py

#__author__=19044168
#date=2021/8/27
import unittest
from HTMLTestRunner import HTMLTestRunner
from Common.dir_config import htmlreport_dir,testcases_dir
import time
from Common.send_mail_file import *
#實(shí)例化套件對(duì)象
suite= unittest.TestSuite()#TestLoader的用法
#1.實(shí)例化Testloader對(duì)象
#2.使用discover去找到一個(gè)目錄下的所有用例
#3.使用suite
loader = unittest.TestLoader()
# suite.addTests(loader.discover(testcases_dir,pattern='log*'))
suite.addTests(loader.discover(testcases_dir,pattern='*test.py'))#運(yùn)行
# runner = unittest.TextTestRunner()
# runner.run(suite)cur_time = time.strftime("%Y-%m-%d-%H-%M-%S",time.localtime())
fp = open(htmlreport_dir + '/' + cur_time + '-AutoTest_report.html','wb')
runner = HTMLTestRunner(stream=fp,title='web測(cè)試報(bào)告',description="這是hbase的web測(cè)試報(bào)告",tester='小豬')
runner.run(suite)e.sendEmail(e.new_report(htmlreport_dir))

?運(yùn)行run.py文件即可

收工!!!

http://www.risenshineclean.com/news/4910.html

相關(guān)文章:

  • 寧波營銷型網(wǎng)站建設(shè)百度站長工具數(shù)據(jù)提交
  • 貴陽手機(jī)網(wǎng)站制作全國免費(fèi)發(fā)布廣告信息平臺(tái)
  • wp網(wǎng)站建設(shè)教程公司域名注冊(cè)查詢
  • 高端網(wǎng)站建設(shè)服務(wù)商seo外包費(fèi)用
  • 建店前期網(wǎng)站開通怎么做分錄百度推廣官方投訴電話
  • poedit wordpress無錫seo優(yōu)化
  • 院系網(wǎng)站建設(shè)網(wǎng)絡(luò)產(chǎn)品運(yùn)營與推廣
  • 一級(jí)a做爰片就在線手機(jī)看韓國網(wǎng)站軟件制作平臺(tái)
  • 中小型網(wǎng)站建設(shè)新聞全國各城市感染高峰進(jìn)度查詢
  • 東莞貿(mào)易公司寮步網(wǎng)站建設(shè)價(jià)格百度關(guān)鍵詞點(diǎn)擊排名
  • 比較公司網(wǎng)站與營銷網(wǎng)站的不同武威網(wǎng)站seo
  • 西安十強(qiáng)網(wǎng)絡(luò)公司搜索引擎優(yōu)化大致包含哪些內(nèi)容或環(huán)節(jié)
  • 外掛網(wǎng)站模板長沙seo網(wǎng)站管理
  • 做公司網(wǎng)站搜索引擎優(yōu)化seo專員
  • ps和dw 做網(wǎng)站百度賬號(hào)怎么改名字
  • 好的做彩平圖的網(wǎng)站百度手機(jī)助手下載安裝
  • 自建免費(fèi)網(wǎng)站朋友圈廣告代理商官網(wǎng)
  • 如何用域名建網(wǎng)站策劃公司排行榜
  • 網(wǎng)站建設(shè)高清圖片百度在線客服系統(tǒng)
  • 織夢(mèng)移動(dòng)端網(wǎng)站模板下載如何在百度搜索到自己的網(wǎng)站
  • 國外 網(wǎng)站 設(shè)計(jì)發(fā)布軟文網(wǎng)站
  • 青浦教育平臺(tái)網(wǎng)站建設(shè)網(wǎng)頁制作接單平臺(tái)
  • 設(shè)計(jì)師門戶網(wǎng)站程序必應(yīng)搜索網(wǎng)站
  • 招遠(yuǎn)網(wǎng)站定制北大青鳥培訓(xùn)機(jī)構(gòu)靠譜嗎
  • 專業(yè)網(wǎng)站建設(shè)顧問長沙網(wǎng)站托管seo優(yōu)化公司
  • 遂寧做網(wǎng)站2022百度收錄越來越難了
  • 網(wǎng)站制作費(fèi)會(huì)計(jì)分錄怎么做企業(yè)網(wǎng)站推廣方法
  • 做公益做的好的的網(wǎng)站上海外貿(mào)網(wǎng)站seo
  • 住房和城鄉(xiāng)建設(shè)部監(jiān)理工程師網(wǎng)站關(guān)鍵詞推廣方式
  • 蘇州公司技術(shù)支持 蘇州網(wǎng)站建設(shè)百度收錄什么意思