Robotic Process Automation (RPA) automatisiert wie menschliche Arbeiter Aufgaben durch Software- oder Hardwaresysteme, die in einer Vielzahl von Anwendungen ausgeführt werden. Software oder Bots können Arbeitsabläufe mit mehreren Schritten und Anwendungen erlernen, z. B. das Empfangen empfangener Formulare, das Senden von Bestätigungsnachrichten, das Überprüfen der Formularintegrität, das Ablegen von Formularen in Ordnern und das Aktualisieren von Tabellenkalkulationen mit Formularnamen und Wartezeit für das Übermittlungsdatum. RPA-Software soll Mitarbeiter von der Last entlasten, sich wiederholende, einfache Aufgaben zu erledigen.
Bitte stellen Sie sicher, dass der entsprechende Client auf dem lokalen Computer installiert ist und sowohl rpa-client
als auch rpa-server
gestartet sind.
Das aktuelle System unterstützt folgende Clients:
AppId | Name |
---|---|
wecom | Unternehmens-WeChat |
Tencent QQ | |
Tim | TIM |
Dingtalk | DingTalk |
Lerche | Feishu |
Da Aufgaben von einem bestimmten Benutzer ausgeführt werden müssen, müssen Sie sicherstellen, dass der Benutzer vorhanden ist, bevor Sie die Aufgabe ausführen.
http://<host>:<port>/users
POST
JSON
Body
Eigentum | Typ | Erforderlich | Beschreibung |
---|---|---|---|
Benutzer | Benutzer[] | Erforderlich | Array von Benutzerobjekten. |
└id | Zeichenfolge | Optional | Benutzer-ID. Wenn es leer ist, generiert der Server automatisch eine ID. |
└appId | Zeichenfolge | Erforderlich | Zugehörige AppID. |
└Konto | Zeichenfolge | Erforderlich | Benutzerkonto, das zum Abgleichen von Kunden verwendet wird. |
└ Spitzname | Zeichenfolge | Optional | Benutzername, der zur Anzeige verwendet wird. |
└ richtiger Name | Zeichenfolge | Optional | Für die Anzeige wird der echte Name des Benutzers verwendet. |
└Unternehmen | Zeichenfolge | Optional | Zur Anzeige wird der Name des Unternehmens verwendet, zu dem der Benutzer gehört. |
Beachten Sie, dass
企业微信
account
der aktuell angemeldeten Person nicht direkt abrufen kann. Derzeit wird der Client über die Kombination${realname}_${company}
zugeordnet.
Schnittstellenbeispiel:
curl -X POST --location " http://localhost:8080/users "
-H " Content-Type: application/json "
-d " {
" users " : [
{
" id " : " uid " ,
" appId " : " wechat " ,
" account " : " account " ,
" nickname " : " nickname "
}
]
} "
insert into user (id, app_id, account, nickname, realname, company, status, created_time, updated_time)
values ( ' uid ' , ' wechat ' , ' account ' , ' nickname ' , ' realname ' , ' company ' , 1 , now(), null );
http://<host>:<port>/tasks
POST
JSON
Body
Eigentum | Typ | Erforderlich | Beschreibung |
---|---|---|---|
Aufgaben | Aufgabe[] | Erforderlich | Array von Aufgabenobjekten. |
└id | Zeichenfolge | Optional | Aufgaben-ID. Wenn es leer ist, generiert der Server automatisch eine ID. |
└ Benutzer-ID | Zeichenfolge | Erforderlich | Zugehörige Benutzer-ID. |
└ Typ | Zeichenfolge | Erforderlich | Informationen zum Aufgabentyp finden Sie in der Aufgabentyp-Wörterbuchtabelle. |
└ Priorität | Ganze Zahl | Optional | Aufgabenpriorität: Je kleiner der Wert, desto höher die Priorität. Wenn es leer ist, wird die standardmäßig konfigurierte Priorität verwendet. |
└Daten | Zeichenfolge | Optional | Aufgabendaten im Format einer JSON Zeichenfolge. |
└ ZeitplanZeit | DatumUhrzeit | Optional | Ausführungszeit der Aufgabe, zum Beispiel: 2022-01-01 10:00:00 . Wenn leer, wird es sofort ausgeführt. |
Beispiel:
curl -X PATCH --location " http://localhost:8080/tasks "
-H " Content-Type: application/json "
-d " {
" tasks " : [
{
" id " : " tid " ,
" userId " : " uid " ,
" type " : " login " ,
" priority " : " 0 " ,
" data " : "" ,
" scheduleTime " : " 2022-01-01 10:00:00 " ,
}
]
} "
insert into task (id, user_id, app_id, type, priority, data, status, created_time, updated_time, schedule_time)
values ( ' tid ' , ' uid ' , ' wechat ' , ' login ' , 0 , null , 0 , now(), null , ' 2022-01-01 10:00:00 ' );
Der Server stellt eine Laufzeittestseite bereit, mit der Entwickler einfache Aufgaben lokal testen können. Öffnen Sie den Browser, besuchen Sie http://<host>:<port>/index.html
und wählen Sie dann den zu testenden Client aus.
Für die Anmeldung am Client sind keine Parameter erforderlich
Für die Abmeldung vom Client sind keine Parameter erforderlich
Parameterformat:
Eigentum | Typ | Erforderlich | Beschreibung |
---|---|---|---|
Ziel | Zeichenfolge | Erforderlich | Objekt senden. |
Nachrichten | Nachricht[] | Erforderlich | Array von Nachrichtenobjekten. |
└ Typ | Zeichenfolge | Erforderlich | Nachrichtentyp. |
└ Inhalt | Zeichenfolge | Erforderlich | Nachrichteninhalt, Textinhalt oder Dateiadresse. |
Nachrichtentyp:
Code | Name | Beschreibung |
---|---|---|
Text | TEXT | Text |
Bild | BILD | Bild |
Video | VIDEO | Video |
Datei | DATEI | dokumentieren |
Parameterbeispiel:
{
"target" : " friend " ,
"messages" : [
{
"type" : " text " ,
"content" : " message "
},
{
"type" : " image " ,
"content" : " https://rpa.leego.io/image.png "
},
{
"type" : " video " ,
"content" : " https://rpa.leego.io/video.mp4 "
},
{
"type" : " file " ,
"content" : " https://rpa.leego.io/file.zip "
}
]
}
Parameterformat:
Eigentum | Typ | Erforderlich | Beschreibung |
---|---|---|---|
Ziel | Zeichenfolge | Erforderlich | Gruppenname. |
Nachrichten | Nachricht[] | Erforderlich | Array von Nachrichtenobjekten. |
└ Typ | Zeichenfolge | Erforderlich | Nachrichtentyp. |
└ Inhalt | Zeichenfolge | Erforderlich | Nachrichteninhalt, Textinhalt oder Dateiadresse. |
Nachrichtentyp:
Code | Name | Beschreibung |
---|---|---|
Text | TEXT | Text |
Bild | BILD | Bild |
Video | VIDEO | Video |
Datei | DATEI | dokumentieren |
erwähnen | ERWÄHNEN | erinnern |
Parameterbeispiel:
{
"target" : " group " ,
"messages" : [
{
"type" : " text " ,
"content" : " message "
},
{
"type" : " image " ,
"content" : " https://rpa.leego.io/image.png "
},
{
"type" : " video " ,
"content" : " https://rpa.leego.io/video.mp4 "
},
{
"type" : " file " ,
"content" : " https://rpa.leego.io/file.zip "
},
{
"type" : " mention " ,
"content" : " member "
}
]
}
Für die Anmeldung am Client sind keine Parameter erforderlich
Für die Abmeldung vom Client sind keine Parameter erforderlich
Parameterformat:
Eigentum | Typ | Erforderlich | Beschreibung |
---|---|---|---|
Ziel | Zeichenfolge | Erforderlich | Objekt senden. |
Nachrichten | Nachricht[] | Erforderlich | Array von Nachrichtenobjekten. |
└ Typ | Zeichenfolge | Erforderlich | Nachrichtentyp. |
└ Inhalt | Zeichenfolge | Erforderlich | Nachrichteninhalt, Textinhalt oder Dateiadresse. |
Nachrichtentyp:
Code | Name | Beschreibung |
---|---|---|
Text | TEXT | Text |
Bild | BILD | Bild |
Video | VIDEO | Video |
Datei | DATEI | dokumentieren |
Parameterbeispiel:
{
"target" : " friend " ,
"messages" : [
{
"type" : " text " ,
"content" : " message "
},
{
"type" : " image " ,
"content" : " https://rpa.leego.io/image.png "
},
{
"type" : " video " ,
"content" : " https://rpa.leego.io/video.mp4 "
},
{
"type" : " file " ,
"content" : " https://rpa.leego.io/file.zip "
}
]
}
Parameterformat:
Eigentum | Typ | Erforderlich | Beschreibung |
---|---|---|---|
Ziel | Zeichenfolge | Erforderlich | Gruppenname. |
Nachrichten | Nachricht[] | Erforderlich | Array von Nachrichtenobjekten. |
└ Typ | Zeichenfolge | Erforderlich | Nachrichtentyp. |
└ Inhalt | Zeichenfolge | Erforderlich | Nachrichteninhalt, Textinhalt oder Dateiadresse. |
Nachrichtentyp:
Code | Name | Beschreibung |
---|---|---|
Text | TEXT | Text |
Bild | BILD | Bild |
Video | VIDEO | Video |
Datei | DATEI | dokumentieren |
erwähnen | ERWÄHNEN | erinnern |
Parameterbeispiel:
{
"target" : " group " ,
"messages" : [
{
"type" : " text " ,
"content" : " message "
},
{
"type" : " image " ,
"content" : " https://rpa.leego.io/image.png "
},
{
"type" : " video " ,
"content" : " https://rpa.leego.io/video.mp4 "
},
{
"type" : " file " ,
"content" : " https://rpa.leego.io/file.zip "
},
{
"type" : " mention " ,
"content" : " member "
}
]
}
Parameterformat:
Eigentum | Typ | Erforderlich | Beschreibung |
---|---|---|---|
Ziel | Zeichenfolge | Erforderlich | Gruppenname. |
Kontakte | Kontakt[] | Erforderlich | Array von Kontaktobjekten. |
└ Ziel | Zeichenfolge | Erforderlich | Mobiltelefonnummer oder E-Mail-Adresse des Benutzers. |
└ Grund | Zeichenfolge | Optional | Fügen Sie Kontaktnotizen hinzu. |
Parameterbeispiel:
{
"contacts" : [
{ "target" : " phone " },
{ "target" : " email " , "reason" : " reason " }
]
}
Zu fortgeschritten für die Anzeige.
Um zu verhindern, dass der Client mehrmals gestartet wird, erstellen Entwickler normalerweise Mutex-Objekte. Ein Mutex ist ein Mechanismus, der in der Multithread-Programmierung verwendet wird, um gemeinsam genutzte Ressourcen vor dem gleichzeitigen Zugriff mehrerer Threads oder Prozesse zu schützen.
HANDLE CreateMutexA (
[in, optional] LPSECURITY_ATTRIBUTES lpMutexAttributes,
[in] BOOL bInitialOwner,
[in, optional] LPCSTR lpName
);
[in, optional] lpMutexAttributes
Zeiger auf eine SECURITY_ATTRIBUTES-Struktur. Wenn dieser Parameter NULL
ist, kann das Handle nicht von untergeordneten Prozessen geerbt werden.
Der lpSecurityDescriptor
Member der Struktur gibt den Sicherheitsdeskriptor für den neuen Mutex an. Wenn lpMutexAttributes
NULL
ist, erhält der Mutex eine Standardsicherheitsbeschreibung. ACL
in der Standardsicherheitsbeschreibung des Mutex stammt vom primären oder Identitätswechsel-Token des Erstellers.
[in] bInitialOwner
Wenn dieser Wert TRUE
ist und der Aufrufer den Mutex erstellt, übernimmt der aufrufende Thread zunächst den Besitz des Mutex-Objekts. Andernfalls übernimmt der aufrufende Thread nicht den Besitz der Mutex-Sperre. Um festzustellen, ob der Aufrufer den Mutex erstellt hat, lesen Sie den Abschnitt „Rückgabewerte“.
[in, optional] lpName
Der Name des Mutex-Objekts. Der Name ist auf MAX_PATH
-Zeichen beschränkt. Bei Namensvergleichen wird die Groß-/Kleinschreibung beachtet.
Wenn lpName
mit dem Namen eines vorhandenen benannten Mutex übereinstimmt, fordert diese Funktion den Zugriff auf MUTEX_ALL_ACCESS
an. In diesem Fall wird der Parameter bInitialOwner
ignoriert, da er bereits durch den Erstellungsprozess festgelegt wurde. Wenn der Parameter lpMutexAttributes
nicht NULL ist, bestimmt er, ob das Handle geerbt werden kann, sein Sicherheitsbeschreibungsmitglied wird jedoch ignoriert.
Wenn lpName
NULL
ist, wird der Mutex ohne Namen erstellt.
Wenn lpName
mit dem Namen eines vorhandenen Ereignisses, Semaphors, wartebaren Timers, Jobs oder Dateizuordnungsobjekts übereinstimmt, schlägt die Funktion fehl und die GetLastError-Funktion gibt ERROR_INVALID_HANDLE
zurück. Dies liegt daran, dass diese Objekte denselben Namensraum haben.
Der Name kann ein „globales“ oder „lokales“ Präfix haben, um das Objekt explizit im globalen oder Sitzungs-Namespace zu erstellen. Der Rest des Namens kann beliebige Zeichen außer dem Backslash-Zeichen () enthalten. Weitere Informationen finden Sie unter Kernel-Objekt-Namespace. Verwenden Sie Terminaldienstesitzungen für einen schnellen Benutzerwechsel. Kernel-Objektnamen müssen den Richtlinien für Terminaldienste entsprechen, damit Anwendungen mehrere Benutzer unterstützen können.
Das Objekt kann in einem privaten Namensraum erstellt werden. Weitere Informationen finden Sie unter Objekt-Namespaces.
Wenn die Funktion erfolgreich ist, ist der Rückgabewert das Handle (Handle) des neu erstellten Mutex-Objekts.
Wenn die Funktion fehlschlägt, ist der Rückgabewert NULL
. Um erweiterte Fehlerinformationen zu erhalten, rufen Sie die Funktion GetLastError auf.
Wenn es sich bei dem Mutex um einen benannten Mutex handelt und das Objekt vor dem Aufruf dieser Funktion existierte, ist der Rückgabewert ein Handle für das vorhandene Objekt und die Funktion GetLastError gibt ERROR_ALREADY_EXISTS
zurück.
Process Explorer ist ein offiziell von Microsoft bereitgestelltes Tool, mit dem Handle
und DLL
Informationen ermittelt werden können, die ein Prozess geöffnet oder geladen hat.
Offizielle Seite des Process Explorer: https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer
Beispiel:
Nehmen wir als Beispiel WeChat: Starten Sie zunächst WeChat, suchen Sie den Prozess WeChat.exe
in der Hauptoberfläche des Process Explorers und wählen Sie ihn aus.
Suchen Sie dann Handle
mit Type
Mutant
und Name
Sessions1BaseNamedObjects_WeChat_App_Instance_Identity_Mutex_Name
in der Schnittstelle Lower Pane
.
Nachdem Sie mit der rechten Maustaste Close Handle
geklickt haben, um das Handle zu schließen, können Sie einen neuen Prozess starten.
handles = handler . find_handles ( process_ids = [ 10000 ], handle_names = [ r'Sessions1BaseNamedObjects_WeChat_App_Instance_Identity_Mutex_Name' ])
handler . close_handles ( handles )
Referenzquellcode: client/handler/handler.py
tscon
geschlossen wurde Wenn Sie Remotedesktop verwenden, um eine Verbindung zu einem Remotecomputer herzustellen, wird beim Schließen von Remotedesktop der Computer gesperrt und der Anmeldebildschirm angezeigt. Im Sperrmodus verfügt der Computer über keine GUI
, sodass alle aktuell ausgeführten oder geplanten GUI
Tests fehlschlagen.
Um Probleme beim GUI
-Testen zu vermeiden, können Sie das Dienstprogramm tscon
verwenden, um die Verbindung zum Remote-Desktop zu trennen. tscon
gibt die Kontrolle an die ursprüngliche lokale Sitzung auf dem Remote-Computer zurück und umgeht den Anmeldebildschirm. Alle Programme auf dem Remote-Computer laufen normal weiter, einschließlich GUI
Tests.
tscon
? tscon
ist ein von Windows-Systemen bereitgestelltes Tool, mit dem eine Verbindung zu einer anderen Sitzung auf dem Remotedesktop-Sitzungshostserver hergestellt werden kann.
tscon
? tscon { < sessionID > | < sessionname > } [/dest: < sessionname > ] [/password: < pw > | /password: * ] [/v]
Parameter | beschreiben |
---|---|
<sessionID> | Gibt die ID der Sitzung an, zu der eine Verbindung hergestellt werden soll. Bei Verwendung des optionalen Parameters /dest:<sessionname> kann auch der Name der aktuellen Sitzung angegeben werden. |
<sessionname> | Geben Sie den Namen der Sitzung an, zu der eine Verbindung hergestellt werden soll. |
/dest: <sessionname> | Gibt den Namen der aktuellen Sitzung an. Wenn Sie eine Verbindung zu einer neuen Sitzung herstellen, wird diese Sitzung getrennt. Sie können diesen Parameter auch verwenden, um die Sitzung eines anderen Benutzers mit einer anderen Sitzung zu verbinden. |
/password: <pw> | Geben Sie das Passwort des Benutzers an, der Eigentümer der Sitzung ist, zu der eine Verbindung hergestellt werden soll. Dieses Passwort ist erforderlich, wenn der verbindende Benutzer nicht Eigentümer der Sitzung ist. |
/Passwort: * | Fragen Sie nach dem Passwort des Benutzers, der Eigentümer der Sitzung ist, zu der Sie eine Verbindung herstellen möchten. |
/v | Zeigt Informationen über den ausgeführten Vorgang an. |
/? | Hilfe an der Eingabeaufforderung anzeigen. |
Um die Verbindung zu einem Remotedesktop zu trennen, führen Sie den folgenden Befehl auf dem Remotecomputer (im Fenster „Remotedesktopverbindung“) als Administrator aus, beispielsweise über die Befehlszeile:
%windir% S ystem32 t scon.exe RDP-Tcp# # # NNN /dest:console
Dabei ist RDP-Tcp### NNN
ID
der aktuellen Remote-Desktop-Sitzung, z. B. RDP-Tcp#5
. Sie können es in der Spalte „Sitzung“ auf der Registerkarte „Benutzer “ des Windows Task-Managers sehen.
Die Meldung „Ihre Remotedesktopdienste-Sitzung wurde beendet“ wird angezeigt und der Remotedesktop-Client wird geschlossen. Alle Programme und Tests auf dem Remote-Computer werden jedoch weiterhin normal ausgeführt.
Tipp: Die Sitzungsspalte ist standardmäßig ausgeblendet. Um es anzuzeigen, klicken Sie mit der rechten Maustaste irgendwo in die Zeile mit CPU, Speicher usw. und wählen Sie im sich öffnenden Kontextmenü Sitzung aus.
Sie können eine Batchdatei verwenden, um den Trennvorgang zu automatisieren. Gehen Sie auf dem Remote-Computer wie folgt vor:
for /f " skip=1 tokens=3 " %%s in ( ' query user %USERNAME% ' ) do (
%windir% S ystem32 t scon.exe %%s /dest:console
)
tscon
hält den Remote-Computer entsperrt, was die Systemsicherheit verringert. Nach Abschluss des Testlaufs können Sie die Maschine mit dem folgenden Befehl sperren:
Rundll32.exe user32.dll, LockWorkStation
Wenn der Prozess rdpclip.exe
auf dem Remotecomputer ausgeführt wird und die Zwischenablage beim Trennen der Remotesitzung nicht leer ist, schlägt der Prozess rdpclip.exe
möglicherweise fehl.
Um dieses Problem zu vermeiden, können Sie den Prozess rdpclip.exe
beenden, bevor Sie die Sitzung trennen.
Wenn Sie Automatisierungsfunktionen erweitern oder mit Clients verschiedener Versionen kompatibel sein müssen, können Sie Aufgabenskripte im Modul rpa-client/app hinzufügen oder bearbeiten.
Im Projekt werden hauptsächlich die folgenden zwei Methoden verwendet:
pywinauto
Ist ein Python-Modul für die Microsoft Windows GUI-Automatisierung. Im einfachsten Fall ermöglicht es Ihnen, Maus- und Tastaturoperationen an Windows-Dialogfelder und -Steuerelemente zu senden, es unterstützt jedoch auch komplexere Operationen, wie z. B. das Abrufen von Textdaten.
Lufttest
Es handelt sich um ein plattformübergreifendes, auf Bilderkennung basierendes UI-Automatisierungstest-Framework, das von NetEase Games eingeführt wurde. Es ist für Spiele und Apps geeignet.
Bitte stellen Sie sicher, dass das von Ihnen verwendete Betriebssystem Windows 7 und höher ist und die Python-Version 3.7.0 und höher ist.
Es ist zu beachten, dass die aktuelle Version von Airtest von pywinauto==0.6.3
abhängt und das aktuelle Projekt pywinauto==0.6.8
erfordert. Bitte fügen Sie bei der Installation der Abhängigkeiten den Parameter --no-deps
hinzu oder führen Sie pip install pywinauto==0.6.8
manuell aus pip install pywinauto==0.6.8
git clone https://github.com/yihleego/robotic-process-automation.git
cd robotic-process-automation/rpa-client
pip install --no-deps -r requirements.txt
Die Client-Konfigurationsdatei befindet sich in rpa-client/config.yml, und Entwickler können die Konfiguration entsprechend den tatsächlichen Szenarien ändern.
Eigentum | Beschreibung | Standard |
---|---|---|
server.host | Serverhost | localhost |
server.port | Server-Port | 18888 |
server.pfad | Serverpfad | /rpa |
server.ssl | Ob SSL aktiviert werden soll | FALSCH |
app.size | Maximale Anzahl ausführbarer Programme | 32 |
app.path. <appid> | Benutzerdefinierter Programmpfad | Aus der Registrierung abrufen |
airtest.cvstrategy | Bilderkennungsalgorithmus | [tpl,sieben,flott] |
airtest.timeout | Bilderkennungsalgorithmus | 20 Sekunden |
airtest.timeout-tmp | Bilderkennungsalgorithmus | 3 Sekunden |
Protokollierungsstufe | Protokollebene | DEBUGGEN |
logging.format | Protokollformat | Standardformat |
logging.filename | Name der Protokolldatei | ./logs/rpa-client.log |
Führen Sie einfach rpa-client/main.py aus.
Bitte stellen Sie sicher, dass Sie die Java-Version 17 oder höher verwenden. Der Dienst ist bei der Ausführung auf MySQL und Redis angewiesen. Bitte installieren und starten Sie diese, bevor Sie den Dienst bereitstellen.
git clone https://github.com/yihleego/robotic-process-automation.git
cd robotic-process-automation/rpa-server
mvn clean install
Eigentum | Beschreibung | Standard |
---|---|---|
spring.datasource.driver-class-name | Datenquellengesteuert | com.mysql.cj.jdbc.Driver |
spring.datasource.url | URL der Datenquelle | jdbc:mysql://localhost:3306/rpa |
spring.datasource.username | Benutzername der Datenquelle | |
spring.datasource.password | Passwort für die Datenquelle | |
spring.data.redis.host | Redis-Host | localhost |
spring.data.redis.port | Redis-Port | 6379 |
spring.data.redis.password | Redis-Passwort | |
spring.data.redis.database | Redis-Datenbank | 0 |
Die obige Konfiguration kann in der Datei application.properties geändert werden.
Eigentum | Beschreibung | Standard |
---|---|---|
rpa.websocket.port | WebSocket-Dienstport | 18888 |
rpa.websocket.path | WebSocket-Dienstpfad | /rpa |
rpa.websocket.idle-timeout | Zeitüberschreitung im Leerlauf des WebSocket-Dienstes | 5m |
rpa.converter.date-time-pattern | Globales Datum-Uhrzeit-Format | jjjj-MM-tt HH:mm:ss |
rpa.converter.date-pattern | globales Datumsformat | jjjj-MM-tt |
rpa.converter.time-pattern | globales Zeitformat | HH:mm:ss |
rpa.client.cache-Schlüssel | Client-Cache-Schlüsselformat | rpa:client: <appid> : <account> |
rpa.client.cache-timeout | Client-Cache-Timeout | 5m |
Weitere Informationen finden Sie unter RpaProperties.
Bevor Sie den Dienst starten, führen Sie bitte das folgende Skript in der MySQL
-Instanz aus
Führen Sie einfach RpaApplication.java aus.
$(".btn").click();
.Um festzustellen, ob eine Anwendung UIA unterstützt, können Sie die offiziell von Microsoft bereitgestellte Software Inspect verwenden, die von der offiziellen Website oder diesem Warehouse heruntergeladen werden kann:
Im Beispiel verwendet WeChat den UiaApp-Modus, da er auf UIA basiert. Enterprise WeChat verwendet dagegen den AirApp-Modus, der der Tatsache ähnelt, dass es auf einer Webseite nur einen Canvas gibt. Alle Elemente werden durch Code gezeichnet und gerendert Sie können also nur durch Bilderkennung positioniert werden.
Laden Sie Visual C++ Redistributable Packages für Visual Studio 2013 herunter: https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=40784
Bitte beziehen Sie sich auf: 2#issue
Dieses Projekt dient nur als Lernreferenz. Bitte verwenden Sie es nicht in einer Produktionsumgebung.
Dieses Projekt steht unter der MIT-Lizenz. Weitere Informationen finden Sie in der LIZENZ-Datei.