__FFXPath() funktioniert nur bei erster Seite?

  • Hallo,

    Gleich das nächste Problem...

    Ich habe folgende Funktion:

    [autoit]

    Func OpenCardPages($EditionPage)
    $sTitle = _ObjDictGetValue($EditionPage, "Title")
    $sUrl = _ObjDictGetValue($EditionPage, "URL")
    ConsoleWrite("EditionPage Title: " & $sTitle & " URL: " & $sUrl & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    _FFTabSetSelected($sTitle, "label")
    $aAllCardLinks = _FFXpath("//a", "href", 6)

    [/autoit][autoit][/autoit][autoit]

    For $sLink in $aAllCardLinks
    ConsoleWrite(@CRLF & "Card Link: " & $sLink & @CRLF)
    if StringInStr($sLink, "/de/") Then
    _FFTabAdd($sLink, false, false)
    EndIf
    Next
    EndFunc

    [/autoit]

    Die Funktion bekommt ein Dictionary Objekt übergeben, das eine Url und den Titel der Seite eines Tabs gespeichert hat. Das funktioniert auch, die Werte Url und Title sind immer richtig.
    Auch das fokussieren des Tabs mit _FFTabSetSelected() funktioniert.
    Ich habe mir sogar mal testweise den Seitenquelltext ausgeben lassen, auch der war korrekt.
    Umso verwunderlicher ist allerdings, dass die _FFXPath()-Funktion nicht ein einziges Ergebnis zurückliefert.

    Folgendes funktioniert aber:

    [autoit]


    _FFStart("http://magiccards.info/roe/de.html") ; Das ist die Seite die auch im oberen Beispiel aufgerufen wird.
    $aAllCardLinks = _FFXpath("//a", "href", 6)

    [/autoit][autoit][/autoit][autoit]

    For $sLink in $aAllCardLinks
    ConsoleWrite(@CRLF & "Card Link: " & $sLink & @CRLF)
    if StringInStr($sLink, "/de/") Then
    _FFTabAdd($sLink, false, false)
    EndIf
    Next

    [/autoit]

    Die Seite wird aufgerufen und alle Links zu den Karten "angeklickt".
    Den einzigen Unterschied, den ICH erkennen kann, ist, dass im funktionierenden Fall die Seite die ist, mit der Firefox gestartet wird.
    Ich brauche also mal wieder Hilfe, um den Fehler zu finden.

    Der Vollständigkeit halber hier der komplette Source code:

    Spoiler anzeigen
    [autoit]


    ; ----------------------------------------------------------------------------------------------
    ; INCLUDES
    ; ----------------------------------------------------------------------------------------------
    #include <FF.au3>
    #include <UDF_ArrayAlternatives.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; ----------------------------------------------------------------------------------------------
    ; GLOBALS
    ; ----------------------------------------------------------------------------------------------
    $EditionPageList = _ObjAListCreate()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; ----------------------------------------------------------------------------------------------
    ; SCRIPT
    ; ----------------------------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    ; Open Firefox in correct window
    ConsoleWrite("------------------------------------------------------------" & @CRLF & "Open Firefox" & @CRLF & "------------------------------------------------------------"& @CRLF)
    _FFStart("http://magiccards.info/sitemap.html#de")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite("------------------------------------------------------------" & @CRLF & "Click Edition Links" & @CRLF & "------------------------------------------------------------"& @CRLF)
    ; Open all edition windows
    ClickEditionLinks()

    [/autoit] [autoit][/autoit] [autoit]

    ; Close sitemap
    ConsoleWrite("------------------------------------------------------------" & @CRLF & "Close Sitemap" & @CRLF & "------------------------------------------------------------"& @CRLF)
    _FFTabClose("Inhaltsübersicht", "label")

    [/autoit] [autoit][/autoit] [autoit]

    ; Close tabs that are no real editions
    ConsoleWrite("------------------------------------------------------------" & @CRLF & "Close Useless Sites" & @CRLF & "------------------------------------------------------------"& @CRLF)
    CloseTabByURL($EditionPageList, "http://magiccards.info/9eb/de.html")
    CloseTabByURL($EditionPageList, "http://magiccards.info/8eb/de.html")
    CloseTabByURL($EditionPageList, "http://magiccards.info/st2k/de.html")
    CloseTabByURL($EditionPageList, "http://magiccards.info/itp/de.html")
    CloseTabByURL($EditionPageList, "http://magiccards.info/grc/de.html")
    CloseTabByURL($EditionPageList, "http://magiccards.info/mbp/de.html")

    [/autoit] [autoit][/autoit] [autoit]

    ; Create Pics Folder
    ConsoleWrite("------------------------------------------------------------" & @CRLF & "Create Pics Folder" & @CRLF & "------------------------------------------------------------"& @CRLF)
    DirCreate("Pics")

    [/autoit] [autoit][/autoit] [autoit]

    ; Go through each tab, open the card pages and save the pictures to the correct folder
    ConsoleWrite("------------------------------------------------------------" & @CRLF & "Go Through Each Edition Page" & @CRLF & "------------------------------------------------------------"& @CRLF)
    For $page In $EditionPageList
    ; Open all card pages of the current edition page
    ConsoleWrite("------------------------------------------------------------" & @CRLF & "Open All Card Pages Of Current Edition Page" & @CRLF & "------------------------------------------------------------"& @CRLF)
    OpenCardPages($page)

    [/autoit] [autoit][/autoit] [autoit]

    Exit

    [/autoit] [autoit][/autoit] [autoit]

    ; Close edition page (it is currently selected)
    ConsoleWrite("------------------------------------------------------------" & @CRLF & "Close Edition Page" & @CRLF & "------------------------------------------------------------" & @CRLF)
    _FFTabClose()
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Exit

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; ----------------------------------------------------------------------------------------------
    ; FUNCTIONS
    ; ----------------------------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    ; ----------------------------------------------------------------------------------------------
    ; Clicks all edition links and saves the pages to our list
    Func ClickEditionLinks()
    $aAllLinks = _FFXpath("//a", "href", 6)
    $iCounter = 0

    [/autoit] [autoit][/autoit] [autoit]

    For $sLink in $aAllLinks
    if StringInStr($sLink, "/de.html") Then
    ConsoleWrite("Add: " & $sLink & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    _FFTabAdd($sLink, true, true)
    $Page = _ObjDictCreate()
    $sUrl = _FFCmd(".location.href")
    $sTitle = _FFCmd(".title")
    _ObjDictAdd($Page, "URL", $sUrl)
    _ObjDictAdd($Page, "Title", $sTitle)
    _ObjAListAdd($EditionPageList, $Page)
    $iCounter += 1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If $iCounter = 3 Then Return 0
    Next
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ; ----------------------------------------------------------------------------------------------
    ; Saves all card pages on
    Func OpenCardPages($EditionPage)
    $sTitle = _ObjDictGetValue($EditionPage, "Title")
    $sUrl = _ObjDictGetValue($EditionPage, "URL")
    ConsoleWrite("EditionPage Title: " & $sTitle & " URL: " & $sUrl & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    _FFTabSetSelected($sTitle, "label")
    $aAllCardLinks = _FFXpath("//a", "href", 6)

    [/autoit] [autoit][/autoit] [autoit]

    For $sLink in $aAllCardLinks
    ConsoleWrite(@CRLF & "Card Link: " & $sLink & @CRLF)
    if StringInStr($sLink, "/de/") Then
    _FFTabAdd($sLink, false, false)
    EndIf
    Next
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ; ----------------------------------------------------------------------------------------------
    ; Closes the Tab that has the passed URL and removes it from the list
    Func CloseTabByURL(ByRef $ArrayList, $search)
    Local $counter = 0

    [/autoit] [autoit][/autoit] [autoit]

    If Not IsObj($ArrayList) Then
    SetError(1)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    For $elem In $ArrayList
    $sUrl = _ObjDictGetValue($elem, "URL")
    If StringCompare($sUrl, $search) = 0 Then
    $sTitle = _ObjDictGetValue($elem, "Title")
    ConsoleWrite("Closing Url: " & $sUrl & " Title: " & $sTitle & @CRLF)
    _FFTabClose($sTitle, "label")
    Return 0
    EndIf
    $counter += 1
    Next

    [/autoit] [autoit][/autoit] [autoit]

    SetError(2)
    Return 0
    EndFunc

    [/autoit]

    Wenn es gar nicht geht, könnte ich zur Not allein mit dem Quelltext weiterarbeiten, aber ... muss nicht ;)

    3 Mal editiert, zuletzt von TheSHEEEP (1. Juli 2010 um 18:05)

  • So, ich habe eine "Lösung" gefunden.
    "Lösung" nur deshalb, weil es etwas unintuitiv ist, dass man es scheinbar machen muss... Egal, hier ist sie:

    [autoit]


    _FFTabSetSelected($sTitle, "label")
    _FFConnect() ; LÖSUNG
    $aAllCardLinks = _FFXpath("//a", "href", 6)

    [/autoit]

    Aus irgend einem Grund scheint die _FFTabSetSelected()-Funktion den Fokus oder was auch immer notwendig ist mit der ausgewählten Seite nicht herzustellen.
    Ein neues _FFConnect() auf der Seite stellt diesen "Fokus" nun wieder her.
    Eine weniger mystische Erklärung habe ich auch nicht, wäre aber dankbar dafür, weswegen ich den Topic auch nicht auf "gelöst" setze.

    PS: Sry für den Doppelpost, hielt ich aber für angebrachter als den Original-Beitrag zu editieren...

  • Ah, das ist natürlich sehr schade.

    Leider behebt das _FFConnect() auch nicht immer das Problem.
    Ich bin inzwischen so weit, dass ich ine iner while-Schleife so lange connect() und XPath mache, bis ich das gewünschte Resultat habe.
    Leider klappt auch das nicht immer und scheint irgendwie in Zusammenhang mit der Internetverbindung zu liegen, was ich mir so gar nicht erklären kann, da der HTML-Code doch "offline" vorliegt.

    EDIT:
    Mein Problem wurde dadurch behoben, dass ich vor jedes FFConnect() noch ein FFDisConnect() geschrieben habe, wie in dem Thread von jemandem beschrieben.
    Sinn macht das IMHO nicht, aber zumindest funktioniert es ;)

    Einmal editiert, zuletzt von TheSHEEEP (8. Juli 2010 um 13:55)