slenium regex EC class

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
brainstir
User
Beiträge: 25
Registriert: Dienstag 26. September 2017, 08:36

hallo,

ich will gerade eine klasse erstellen, mit der ich einen url regex-match in selenium überprüfen kann.

ich habe nun das hier gefunden:

Code: Alles auswählen

import re

from selenium.webdriver.support.expected_conditions import _find_element


class text_match(object):
    def __init__(self, locator, regexp):
        self.locator = locator
        self.regexp = regexp

    def __call__(self, driver):
        element_text = _find_element(driver, self.locator).text
        return re.search(self.regexp, element_text)
Usage:

WebDriverWait(driver, 60).until(
    text_match((By.XPATH, "//tr[5]/td[11]/div"), r"[0,1]{1}.[0-9]{6}")
)
und es für mich angepasst:

Code: Alles auswählen

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import re


class url_match(object):
    def __init__(self, regexp):
        self.regexp = regexp

    def __call__(self, driver):
        urlmatch_re = EC.url_matches(driver, self.locator).text
        return re.search(self.regexp, urlmatch_re)

und so angewendet:

    element = WebDriverWait(driver, 60).until(
        url_match((driver.current_url), r"https\:\/\/REGEX_URL")


Und die url_matches funktion von selenium sieht so aus:

Code: Alles auswählen

class url_matches(object):
    """An expectation for checking the current url.
    pattern is the expected pattern, which must be an exact match
    returns True if the title matches, false otherwise."""
    def __init__(self, pattern):
        self.pattern = pattern

    def __call__(self, driver):
        import re
        match = re.search(self.pattern, driver.current_url)

        return match is not None



Aber ich bekomme nun den Fehler:
TypeError: __init__() takes 2 positional arguments but 3 were given

Was mache Ich bei der Definition der Klasse falsch?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@brainstir: wenn Du die beiden Klassen vergleichst, was fällt Dir auf? Wieviele Parameter hat die originale Klasse und wieviele Deine?
brainstir
User
Beiträge: 25
Registriert: Dienstag 26. September 2017, 08:36

Keine Ahnung, aber laut dem Fehlercode werde ich irgendwie 3 PAranmeter übergeben und er erwartet Zwei.
Allerdings hat sich das Problem shcon erledigt, da die EC das schon von Haus aus können.
brainstir
User
Beiträge: 25
Registriert: Dienstag 26. September 2017, 08:36

Ich weiß auch gar nicht, ob Ich überhaupt auf dem richtigen Weg bin:

Ich will etwas Webscraping auf einer Webseite machen, die ich manuell besuchen möchte.

Ich hab das Ganze jetzt so weit mit Selenium gemacht, da Ich mich dann nicht mit dem ganzen AJAX und Javascript-Kram herumärgern muss, da die Webseite, die Ich scrapen möchte davon viel nutzt.

Kann Selenium überhaupt mit manuellen Klicks des Benutzers umgehen?
Oder ist das wirklich nur für eine vollautomatisierung gedacht?
Weil, wenn Ich manuell auf etwas klicke und danach in dem HTML-quellcode der Webseite, die Ich angeklickt habe suche, findet er das Element nicht.
Obwohl es da ist.
Antworten