airtest

__author__ = "wangheyang"

import re
import sys, io
import warnings

warnings.filterwarnings("ignore")
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf8')

import pymongo
from airtest.core.api import *
from airtest.core.android.android import *
from airtest.cli.parser import cli_setup
from poco.drivers.android.uiautomation import AndroidUiautomationPoco


class AirTestTrain():
    def __init__(self):
        # 本地表,留完整备份
        client = pymongo.MongoClient()
        self.coll = client.get_database('crawler').get_collection('crawler_train_12306_list')
        self.exists_list = self.coll.distinct("搜索车次") + self.coll.distinct("search_id")
        # 线上mongo链接
        self.mongo = pymongo.MongoClient('mongodb://miotech-crawler:Mi0Tech2020@10.120.80.56:27018/admin')
        self.tieyou_coll = self.mongo["crawler"]["crawler_tieyou_train_num"]  # 铁友总id数据
        self.train_id_list = self.tieyou_coll.distinct("train_id", {"start_with_num": "G"})
        #  两个目标表
        self.train_12306_info = self.mongo["crawler"]["crawler_train_12306_info"]
        self.train_12306_station = self.mongo["crawler"]["crawler_train_12306_station"]

        self.poco = AndroidUiautomationPoco()
        # self.train_id_list = ["G1104"]
        if not cli_setup():
            auto_setup(__file__, logdir=True,
                       devices=["android://127.0.0.1:5037/emulator-5554?cap_method=MINICAP&touch_method=MAXTOUCH&", ])

    def input_no(self, train_no):
        for i in train_no:
            self.poco(text=i).click()

    def main(self):
        start_app("com.MobileTicket")
        # #  进入时刻表信息
        self.poco(text="时刻表").click()
        for search_id in self.train_id_list:
            print(search_id)
            if search_id in self.exists_list:
                continue
            time_old = time.time()
            try:
                input_key = self.poco(textMatches='.*车次号.*')
                # if not input_key:
                #     break
                input_key.click()
                time.sleep(0.3)  # 等待一秒钟确保输入焦点在正确的位置

                self.input_no(search_id)
                self.poco(text="确认").click()
                self.poco(text="查询").click()
                time.sleep(0.3)
                # 特殊情况处理
                if self.poco(textMatches=".*未查询到该车次.*"):
                    self.coll.insert_one({"搜索车次": search_id, "日期": "未查询到该车次", "入库时间": int(time.time())})
                    self.poco(name="com.android.systemui:id/back").click()
                    continue
                time.sleep(0.3)
                # 特殊情况处理
                if self.poco(text="查看其它车次"):
                    self.coll.insert_one(
                        {"搜索车次": search_id, "日期": "列车运输组织调整,本日不开行", "入库时间": int(time.time())})
                    self.poco(text="查看其它车次").click()
                    continue

                #    查找起始站到终点站信息
                info = ""
                infos = self.poco("trainStatusMsg").children()
                for info_ in infos:
                    if not info_.attr("text"):
                        for i in info_.children():
                            if "到达" in i.attr('text'):
                                info = i.attr('text')
                info_data = dict()
                yunxingxinxi = dict()
                data = re.findall("(\d+月\d+日,.*?),(\d+时\d+分),从(.*?)出发,(\d+时\d+分),到达(.*?),(历时.*)", info)
                for match in data:
                    month_day = match[0]
                    time_departure = match[1]
                    departure = match[2]
                    time_arrival = match[3]
                    destination = match[4]
                    duration = match[5]

                    yunxingxinxi["日期"] = month_day
                    yunxingxinxi["出发时间"] = time_departure
                    yunxingxinxi["出发地点"] = departure
                    yunxingxinxi["到达时间"] = time_arrival
                    yunxingxinxi["目的地"] = destination
                    yunxingxinxi["历时"] = duration

                self.poco(textMatches=".*G.*经停站.*").swipe([0, -0.45])

                current_node = self.poco("trainStatusMsg").sibling("android.view.View").child()[0]
                print("-------------")
                train_chexiang = dict()
                train_jingting_list1 = list()
                cheliangxinxi = dict()
                element = self.poco(textMatches="展开")
                for i in element:
                    if i.attr("pos")[0] == 0.48333333333333334:
                        i.click()
                for i in current_node.children():
                    if i.attr("text"):
                        if i.attr("name") == "android.view.View":
                            train_attr = i.attr("text")
                            if "经停站" in train_attr:
                                info_data["结果车次"] = train_attr.replace("经停站", "")
                            elif "停留" in train_attr:
                                train_jingting_list1.append(train_attr)
                            elif "," in train_attr:
                                train_attr_key = train_attr.split(",")[0]
                                train_attr_value = train_attr.split(",")[1]
                                cheliangxinxi[train_attr_key.strip() + "车"] = train_attr_value.strip()
                            else:
                                info_data["车型"] = train_attr
                    else:
                        for ii in i.children():
                            if not ii.attr("text") and ii.attr('name') == 'android.view.View':
                                if ii.child():
                                    train_chexiang_key, train_chexiang_value = ii.children().attr("text").split("车 ",
                                                                                                                1)
                                    train_chexiang[train_chexiang_key] = train_chexiang_value
                info_data["车厢信息"] = train_chexiang
                info_data["运行信息"] = yunxingxinxi
                info_data["车辆信息"] = cheliangxinxi
                info_data["经停站信息"] = train_jingting_list1
                info_data["搜索车次"] = search_id
                info_data["入库时间"] = int(time.time()*1000)
                info_data["更新时间"] = int(time.time()*1000)
                print(info_data)
                time_new = time.time()
                time_s = time_new - time_old
                info_data["所用时间"] = time_s
                self.save_(info_data)
                self.coll.insert_one(info_data)
            except Exception as e:
                print(e)
            self.poco(name="android.widget.Button", text="返回").click()
            time.sleep(0.3)

    def save_(self, data):
        # 车辆信息入库
        my_data = dict()
        my_data["train_num"] = data.get("结果车次")
        my_data["train_model"] = data.get("车型")
        speed = data.get("车辆信息").get("最高时速车")
        my_data["speed"] = float(speed.replace("km/h", "")) if speed else None
        my_data["origin"] = data.get("运行信息").get("出发地点")
        my_data["destination"] = data.get("运行信息").get("目的地")
        result = list()
        for k, v in data.get("车厢信息", {}).items():
            seat_class, capacity = v.split(" ")
            if "/" in seat_class:
                seat_class_list = seat_class.split("/")
                capacity_list = capacity.split("/")
                if len(seat_class_list) == 2:
                    if len(capacity_list) == 2:
                        for index, seat_class in enumerate(seat_class_list):
                            cabin_info_dict = dict()
                            cabin_info_dict["index"] = k
                            cabin_info_dict["capacity"] = capacity_list[index].strip()
                            cabin_info_dict["seat_class"] = seat_class.strip()
                            result.append(cabin_info_dict)
                    else:
                        for index, seat_class in enumerate(seat_class_list):
                            cabin_info_dict = dict()
                            cabin_info_dict["index"] = k
                            cabin_info_dict["capacity"] = capacity_list[0].strip()
                            cabin_info_dict["seat_class"] = seat_class.strip()
                            result.append(cabin_info_dict)
            else:
                cabin_info_dict = dict()
                cabin_info_dict["index"] = k
                cabin_info_dict["capacity"] = capacity.strip()
                cabin_info_dict["seat_class"] = seat_class.strip()
                result.append(cabin_info_dict)
        my_data["cabin_info"] = result
        my_data["update_at"] = data.get("更新时间")
        my_data["insert_at"] = data.get("入库时间")
        self.train_12306_info.insert_one(my_data)  # 车辆信息入库
        # 停靠站信息
        my_data_station = dict()
        my_data_station["train_num"] = data.get("结果车次")
        station_list = list()
        stations = data.get("经停站信息")
        if stations:
            for station in stations:
                station_list.append(station.split("到达")[1].split(",")[0])
        my_data_station["station_info"] = station_list
        my_data_station["update_at"] = data.get("更新时间")
        my_data_station["insert_at"] = data.get("入库时间")
        self.train_12306_station.insert_one(my_data_station)  # 停靠站点信息


if __name__ == '__main__':
    AirTestTrain12306 = AirTestTrain()
    AirTestTrain12306.main()







  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值