[PYTHON] Greifen Sie automatisch auf den Fluss in enebular zu und drücken Sie den Abzug

Ich bin Niamugi, der für den zweiten Tag des [enebularen Adventskalenders 2019] verantwortlich ist (https://qiita.com/advent-calendar/2019/enebular). Dieses Mal möchte ich Ihnen zeigen, wie Sie automatisch auf http://enebular.com/app zugreifen und den Flow auslösen können.

Weise

Schaben

Auslösen

Der von enebular erstellte Node-RED-Flow wird schließlich auf einem Gerät oder Dienst bereitgestellt. Obwohl es einen Fluss auf enebular gibt, ist es eine Verschwendung, ihn nicht zu benutzen ... Kann der Flow verwendet werden, wenn er automatisch geöffnet und ausgeführt werden kann? Ich dachte, ich habe es versucht.

Ausprobieren

Schreiben Sie einen Node-RED-Flow zum Testen

Das Klicken auf die Schaltfläche des Injektionsknotens "Start" ist ein Ablauf, der nur GCP-Cloud-Funktionen mit einer http-Anforderung ausführt. enebular_node_red.PNG

Scraping http://enebular.com/app

Wir werden Schritt für Schritt von dem Ort aus untersuchen, an dem die Webseite geöffnet wird. Das Programm ist in Python geschrieben, das leicht zu kratzen ist.

Anmeldung

Öffnen Sie http://enebular.com/app und warten Sie, bis Sie Ihre E-Mail-Adresse eingeben können.
WebDriverWait(driver, 5).until(ec.element_to_be_clickable((By.NAME, "email")))

Geben Sie beim Öffnen Ihre E-Mail-Adresse und Ihr Passwort ein und drücken Sie die Eingabetaste.

id = driver.find_element_by_name("email")
id.send_keys(un)
password = driver.find_element_by_name("password")
password.send_keys(pw)
password.send_keys(Keys.ENTER)

Wählen Sie ein Asset aus

Warten Sie, bis das ausgewählte Asset angezeigt wird. Diesmal ist es "Test Scraping".
assetNm = "testscraping"
assetPath = '//span[@data-testid="' + assetNm +'"]'
WebDriverWait(driver, 5).until(ec.element_to_be_clickable((By.XPATH, assetPath)))

Klicken Sie auf das Asset, wenn es angezeigt wird.

driver.find_element_by_xpath(assetPath).click()

Klicken Sie in der Übersicht auf die Schaltfläche "Bearbeiten"

Warten Sie, bis die Asset-Übersicht angezeigt wird. Es wird beurteilt, dass die Zeit angezeigt wird, zu der auf die Schaltfläche Bearbeiten auf der rechten Seite geklickt werden kann.
editBtn = '//button[@data-testid="btn-edit-flow"]'
WebDriverWait(driver, 5).until(ec.element_to_be_clickable((By.XPATH, editBtn)))

Klicken Sie auf die Schaltfläche Bearbeiten, wenn sie angezeigt wird.

driver.find_element_by_xpath(editBtn).click()

Tabs wechseln

Klicken Sie auf die Schaltfläche Bearbeiten, um den Ablauf auf einer separaten Registerkarte anzuzeigen. Daher ist es notwendig, die Registerkarten zu wechseln.

handle_array = driver.window_handles
driver.switch_to.window(handle_array[1])

Warten Sie, bis der Fluss angezeigt wird

** Dies ist die größte Herausforderung. ** **. Zunächst wird "Laden ..." angezeigt.

Als nächstes wird der Rahmen zum Bearbeiten des Flusses angezeigt. ** Zu diesem Zeitpunkt wird die Registerkarte "Fluss" noch nicht angezeigt. ** ** ** Nach einer Weile werden die Flussregisterkarten (Dummy und diesmal Eingabe) angezeigt.

Da die Frame-Anzeige und das Timing der Registerkartenanzeige unterschiedlich sind, ist ein gewisser Einfallsreichtum erforderlich. Das Problem wurde gelöst, indem das Laden von Frames wiederholt wurde, bis der Flow korrekt angezeigt wurde (= Registerkarten wurden angezeigt). (Es ist nicht gut, mit "while True" zu warten ... Sie sollten ein Zeitlimit haben ...)

flowNm = 'input'
frame = '//div[@id="iframeBlock"]/iframe'
flowPath = '//a[@title="' + flowNm + '"]'

# Loading...Warten Sie bis zum Ende
WebDriverWait(driver, 30).until(ec.frame_to_be_available_and_switch_to_it((By.XPATH, frame)))

#Warten Sie, bis der Durchfluss vollständig angezeigt wird
while True:
    #Machen Sie den Rahmen rückgängig
    driver.switch_to.default_content()
    #Frames wechseln
    iframe = driver.find_element_by_xpath(frame)
    driver.switch_to_frame(iframe)        

    try:
        #Ausnahme, wenn der Fluss nicht korrekt angezeigt wird
        WebDriverWait(driver, 1).until(ec.visibility_of_element_located((By.XPATH, flowPath)))
        break
    except:
        pass

Klicken Sie auf die Registerkarte, wenn sie angezeigt wird.

driver.find_element_by_xpath(flowPath).click()

Drücken Sie den Auslöser

Klicken Sie diesmal auf die Schaltfläche des Startknotens "Start", um den Fluss auszuführen. Es ist mühsam, zum Knoten zu gelangen.
triggerNodeNm = 'start'
try:
    #Auf Leinwand verschieben
    workspace = driver.find_element_by_id('workspace')
    chart = workspace.find_element_by_id('chart')
    canvas = chart.find_element_by_class_name('innerCanvas')
    
    # class = "node nodegroup"Finden
    nodes = canvas.find_elements_by_css_selector('.node.nodegroup')
    #Überprüfen Sie, ob der Knotenname mit dem angegebenen übereinstimmt
    #Wenn sie übereinstimmen, drücken Sie den Auslöser
    for node in nodes:
        nodeNm = node.find_element_by_tag_name('text').text
        if nodeNm == triggerNodeNm:
            node.find_element_by_class_name('node_button_button').click()
            break
        
except Exception as e:
    driver.quit()

Nach dem Drücken des Auslösers wird der Bildschirm geschlossen und der Vorgang beendet.

driver.quit()

Ergebnis des Versuchs

Wenn Sie das Programm ausführen ... Die CloudFunctions-Funktion wurde ausgeführt!

Zusammenfassung

Ich konnte den enebularen Fluss durch Schaben ausnutzen. Diese Methode kann ausreichend sein, wenn der Ablauf nicht von dem System oder der Schnittstelle abhängt, auf dem er bereitgestellt wird. (Es gibt ein Problem, dass es nicht funktioniert, wenn sich der Tag- oder Klassenname der Webseite ändert ...)

Ich hoffe, es gibt Ihnen einige Hinweise. Bis bald.

Recommended Posts

Greifen Sie automatisch auf den Fluss in enebular zu und drücken Sie den Abzug
Greifen Sie mit Python auf die Twitter-API zu
Überprüfen Sie, ob die Schulhomepage automatisch aktualisiert wird
Suchen Sie es in der Warteschlange und bearbeiten Sie es
Greifen Sie auf Dateien im selben Verzeichnis wie die ausführbare Datei zu
12. Speichern Sie die erste Spalte in col1.txt und die zweite Spalte in col2.txt
Erstellen Sie automatisch Wort- und Excel-Berichte mit Python
Über den Unterschied zwischen "==" und "is" in Python
Wenn sich Achse und Beschriftung in matplotlib überlappen
Macports easy_install löst die Version automatisch auf und führt sie aus
Greifen Sie über REPL auf die im Skript definierten Variablen zu