"Ersetzen wir UWSC durch Python" Teil 5. Dieses Mal werden wir tatsächlich einen Roboter bauen. Ich konnte aus verschiedenen Gründen eine Weile nicht posten.
Wie ich das letzte Mal geschrieben habe, schreibe ich während der Überprüfung, daher denke ich, dass es einige Fehler gibt. In diesem Fall stellen Sie bitte eine Bishibashi-Bearbeitungsanfrage (Schweiß)
Als ich in UWSC gesucht habe, wurde es anscheinend durch die folgende Site ergänzt, daher werde ich versuchen, die Funktion zu implementieren, die ich im Forum schreiben möchte.
CSWU-Was zu tun Kompatibles System ohne UWSC https://wiki3.jp/CSWU
letztes Mal UWSC durch Python (4) Cheet Sheet [2] ersetzen nächstes Mal unentschlossen </ font>
Wir werden einige der Funktionen erstellen, die UWSC in dieser Umgebung nicht bietet. Die zu machende Funktion ist
―― 1. Hervorhebung der Bildsuche (Fokus) ―― 2. Hervorhebung der Elementsuche (Fokus) --3. GETID / CLKITEM-Kompatibilitätsfunktion
Darüber hinaus waren die folgenden Websites beim Erstellen der Funktionen sehr hilfreich. Wenn Sie eine Funktion haben, die Sie erstellen möchten, sollten Sie darauf verweisen.
Python Example https://www.programcreek.com/python/
Wenn Sie nach Bildern suchen, können Sie leicht erkennen, wo auf dem Bildschirm die Übereinstimmung hergestellt wurde, indem Sie ein Rechteck auf dem Bildschirm zeichnen. Wenn Sie win32gui importieren und geben (links, oben, rechts, unten), wird der erkannte Ort hervorgehoben. Wenn Sie den Linientyp oder die Farbe des Rechtecks ändern möchten, müssen Sie ihn mit "win32ui.CreatePen", "win32api.RGB", "pyhandle", "win32con" festlegen.
func_dhlight.py
import win32gui
##Desktop-Highlights
def dhlight(x1, y1, x2, y2):
hwnd=win32gui.WindowFromPoint((x1,y1))
hdc=win32gui.GetDC(hwnd)
rc=(x1, y1, x2, y2)
win32gui.DrawFocusRect(hdc, rc)
win32gui.ReleaseDC(hwnd,hdc)
if __name__ == '__main__':
##Es fühlt sich an, als würde man es in Kombination mit pyautoguis locateOnScreen verwenden.
##LocateOnScreen ist jedoch Box(left, top, width, height)Weil es zurückkehrt
pos_x,pos_y,size_w,size_h = pyautogui.locateOnScreen('target.png')
x1 = pos_x
y1 = pos_y
x2 = pos_x + size_w
y2 = pos_y + size_h
dhlight(x1, y1, x2, y2)
##Wenn Sie schreiben, zielen Sie.Dort, wo sich das PNG befindet, wird ein gepunktetes Rechteck angezeigt.
Bei der Suche nach einem Element im Browser wird hervorgehoben, welches Element ausgewählt wurde. Dies verwendet die CSS-Einfügung von Selen, sodass es bei dynamischer UI / UX möglicherweise nicht reagiert oder das Umschreiben von CSS verbietet (es ist besser, die Koordinaten des Elements zu nehmen und mit win32gui zu zeichnen). vielleicht) Ich habe gerade CSS angeschlossen ("Hintergrund: Weiß; Rand: 1px durchgehend blau;"), damit ich es nach meinen Wünschen ändern kann.
func_hhlight.py
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
##Highlights von Html Element
def hhlight(element):
driver = element._parent
def apply_style(s):
driver.execute_script("arguments[0].setAttribute('style', arguments[1]);",element, s)
original_style = element.get_attribute('style')
apply_style("background: white; border: 1px solid blue;")
time.sleep(.3)
apply_style(original_style)
if __name__ == '__main__':
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.set_page_load_timeout(5)
driver.set_script_timeout(5)
driver.get('https://www.google.com/')
##Wenn Sie nach einem Element suchen und das Element an die erstellte Funktion übergeben, wird das angegebene CSS angewendet.
##Sie können sehen, welches Element ausgewählt ist
search_box = driver.find_element_by_name("q")
hhlight(search_box)
In UWSC habe ich GETID verwendet, um die Fenster-ID abzurufen und zu betreiben. In Python ist dies jedoch schwierig. Daher habe ich eine Funktion verwendet, um die Prozess-ID aus dem Fensternamen (get_pid) und das Fensterhandle aus der Prozess-ID (get_hwnds) abzurufen. Ich beschloss, es zu schaffen und damit umzugehen.
func_getid.py
import os,sys,re,time,subprocess
import win32api, win32gui, win32con, win32process
def get_pid(title):
hwnd = win32gui.FindWindow(None, title)
threadid,pid = win32process.GetWindowThreadProcessId(hwnd)
return pid
def get_hwnds(pid):
def callback(hwnd, hwnds):
if win32gui.IsWindowVisible(hwnd) and win32gui.IsWindowEnabled(hwnd):
_, found_pid = win32process.GetWindowThreadProcessId(hwnd)
if found_pid == pid:
hwnds.append(hwnd)
return True
hwnds = []
win32gui.EnumWindows(callback, hwnds)
return hwnds
def clkitem(win_title,itemid):
#Suche nach Fenstertitel
hwnd = win32gui.FindWindow(0, win_title)
#Listen Sie die Elemente im Fenster auf
inplay_children = []
def is_win_ok(hwnd, *args):
s = win32gui.GetWindowText(hwnd)
inplay_children.append(hwnd)
win32gui.EnumChildWindows(hwnd, is_win_ok, None)
#Geben Sie die Artikel-ID und den Artikel an/Holen Sie sich den Griff der Schaltfläche
button_hwnd = inplay_children[itemid]
#Aktivieren Sie das Fenster
win32gui.SetForegroundWindow(hwnd)
#Klicken Sie auf die angegebene Schaltfläche (drücken Sie)->Release senden)
win32api.PostMessage(button_hwnd, win32con.WM_LBUTTONDOWN, 0, 0)
win32api.PostMessage(button_hwnd, win32con.WM_LBUTTONUP, 0, 0)
#Prozess-ID von Fenster-ID abrufen
pid = get_pid(u"Taschenrechner")
#Klicken Sie auf die erste Schaltfläche im Taschenrechner
clkitem(u"Taschenrechner",1)
#Holen Sie sich das Handle von der Prozess-ID und arbeiten Sie[GETCTLHND]Gleichwertig
for hwnd in get_hwnds(pid):
if hwnd == 0:
print(u"Fenster nicht gefunden")
else:
#Größenangabe(Größe ändern)
win32gui.MoveWindow(hwnd, 100, 100, 500, 500, True)
#Maximieren
win32gui.ShowWindow(hwnd, win32con.SW_MAXIMIZE)
time.sleep(1)
#schließen
win32gui.SendMessage(hwnd,win32con.WM_CLOSE,0,0)
Sie können jetzt die Größe von nativen Apps auf Ihrem Bildschirm ändern, sie verschieben und fokussieren. Für den Browser ist es einfacher, mit Selen zu arbeiten.
Der in [] enthaltene Teil ist der zu verwendende Modulname
--1. Laden Sie ini (settings.ini) mit Anmeldeinformationen: [ConfigParser] --2 Öffnen Sie den Browser, maximieren Sie ihn und gehen Sie zu inis login_url: [Selenium] --3 Anmeldung mit Anmeldeinformationen: [Selen] --4. Zum angegebenen Bildschirm (Beitrag) wechseln: [Selenium / win32gui] --5. Öffnen Sie die Excel-Datei mit der Eintragsinformationsliste [xlrd]. --6.1 Zeile für Zeile im Eingabeformular [Selen] ―― 7. Wenn die letzte Zeile der Excel-Datei erkannt wird, schließen Sie den Bildschirm und beenden Sie [Selen]
setting.ini
[Server]
login_id = user01
login_pw = password
login_url = https://127.0.0.1/wp/wp-login.php
[SitePage]
write_fourm =Post
[WriteFile]
excel_file = input_list.xlsx
input_list.xlsx
[Sheet1]
title,text,tag,format
Test 1,Erster Beitrag 1,Nicht kategorisiert,Standard
Test 2,Erster Beitrag 2,Nicht kategorisiert,Standard
Test 3,Erster Beitrag 3,Nicht kategorisiert,Standard
Test 4,Erster Beitrag 4,Nicht kategorisiert,Standard
Test 5,Erster Beitrag 5,Nicht kategorisiert,Standard
Test 6,Erster Beitrag 6,Nicht kategorisiert,Standard
Eigentlich werde ich die Quelle entsprechend dem Szenario schreiben. Eigentlich sollte ich mehr Funktionen erstellen und sie leichter lesbar machen, aber ich habe sie flach geschrieben, damit das Szenario leicht verfolgt werden kann. Bitte beachten Sie, dass es in UTF-8 geschrieben ist.
wordpress_auto_post.py
# -*- coding: utf-8 -*-
#Modul laden
import os,sys,re,time,subprocess
import pyautogui
import win32gui
import configparser
import xlrd
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.alert import Alert
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.select import Select
##Desktop-Highlights
def dhlight(x1, y1, x2, y2):
hwnd=win32gui.WindowFromPoint((x1,y1))
hdc=win32gui.GetDC(hwnd)
rc=(x1, y1, x2, y2)
win32gui.DrawFocusRect(hdc, rc)
win32gui.ReleaseDC(hwnd,hdc)
##Highlights von Html Element
def hhlight(element):
driver = element._parent
def apply_style(s):
driver.execute_script("arguments[0].setAttribute('style', arguments[1]);",element, s)
original_style = element.get_attribute('style')
apply_style("background: white; border: 1px solid blue;")
time.sleep(.3)
apply_style(original_style)
#Konfigurationsdatei lesen
CONF_FILEPATH = 'setting.ini'
config = configparser.ConfigParser()
config.read( CONF_FILEPATH, 'UTF-8')
#In der conf-Datei[]Geben Sie den Ort an, der von umgeben ist
config_server = config['Server']
config_page = config['SitePage']
config_excel = config['WriteFile']
#In conf[]Holen Sie sich den Inhalt, der Variablen und Daten enthält, unter
uid = config_server['login_id']
upw = config_server['login_pw']
url = config_server['login_url']
search_button = config_page['write_fourm']
xlsxfile = config_excel['excel_file']
##Chrome initialisieren
options = Options()
##Chrome-Pfad (normalerweise nicht angegeben, wenn tragbare Version usw. oder stabil verwendet wird/Beim Beta-Wechsel)
options.binary_location = 'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe'
options.add_argument('--start-maximized')
options.add_argument('--disable-gpu')
##Erstellen Sie ein Chrome WebDriver-Objekt.
driver = webdriver.Chrome(options=options,executable_path="C:\Python37\chromedriver.exe")
#Die Wartezeit bis zum Auffinden des Elements kann nur unmittelbar nach der Treibergenerierung angegeben werden
driver.implicitly_wait(10)
#Geben Sie an, dass bis zu 5 Sekunden gewartet werden soll, bis die Seite vollständig geladen ist, nur unmittelbar nach der Treibergenerierung
driver.set_page_load_timeout(5)
#Geben Sie an, dass bis zu 5 Sekunden gewartet werden soll, bis die Ausführung von Javascript abgeschlossen ist
driver.set_script_timeout(5)
#URL verschieben
driver.get(url)
#Anmeldevorgang
user_id_elm = driver.find_element_by_id("user_login")
#Element hervorheben
hhlight(user_id_elm)
user_id_elm.send_keys(uid)
user_pw_elm = driver.find_element_by_id("user_pass")
hhlight(post_fourm)
user_pw_elm.send_keys(upw)
login_submit = driver.find_element_by_id("wp-submit")
hhlight(post_fourm)
login_submit.submit()
time.sleep(5)
#Post
menu_post_elm = driver.find_element_by_xpath("/html/body/div[1]/div[1]/div[2]/ul/li[3]/a/div[3]")
hhlight(menu_post_elm)
menu_post_elm.click()
time.sleep(2)
#Neuer Zusatz
new_post_elm = driver.find_element_by_xpath("/html/body/div[1]/div[2]/div[2]/div[1]/div[3]/a")
hhlight(new_post_elm)
new_post_elm.click()
time.sleep(2)
#Öffnen Sie die Excel-Datei
wb = xlrd.open_workbook(xlsxfile)
#Blattbezeichnung
sheet = wb.sheet_by_name('sheet1')
#Erkennung der letzten Zeile
last_row = sheet.nrows
#Lesen Sie in ein zweidimensionales Array aller Zeilen(Wenn Sie nicht genügend Speicher haben, sollten Sie Zeile für Zeile lesen)
readcells = [sheet.row_values(row) for row in range(sheet.nrows)]
time.sleep(5)
#Artikelüberschrift
card_title_elm = driver.find_element_by_xpath("//*[@id='post-title-0']")
#Artikel Text
card_body_elm = driver.find_element_by_xpath("/html/body/div[1]/div[2]/div[2]/div[1]/div[3]/div[1]/div/div/div/div[2]/div[3]/div/div[1]/div/div/div[2]/div[1]/div[3]/div/div/div/div/div/div/p")
#Fahrer verlassen
driver.close()
python ./wordpress_auto_post.py
Es sollte sich ohne Probleme bewegen und veröffentlicht werden.
Es tut wirklich weh, UWSC zu verlieren, und ich hoffe, dass es einfachere Automatisierungstools gibt. Nächstes Mal werde ich eine Fortsetzung schreiben, wenn mir etwas einfällt.
Recommended Posts