chkdsk
Goto Top

Firefox Tab oder Webpage automatisch aktualisieren

Hallo Zusammen,

folgende Situation habe ich...wir haben hier eine Webseite, welche regelmäßig aktualisiert werden muss. Bspw. alle 10 Sekunden.
Wir arbeiten hier mit dem Firefox ESR. Addons sind deaktiviert. D.h. das Problem, oder nennen wir es Herausforderung face-smile sollte über ein Skript gelöst werden.
Folgendes habe ich schon.
while(1) { # Loop forever
	sleep -Seconds 5 # Wait 5 seconds
    $wshell = New-Object -ComObject wscript.shell 
    if($wshell.AppActivate('Firefox')) { # Switch to Firefox  
    Sleep 1 # Wait for Firefox to "activate" 
    $wshell.SendKeys('{F5}')  # Send F5 (Refresh)  
    } else { break; } # Firefox not open, exit the loop
}
das funktioniert auch eigentlich ganz gut, allerdings wird nur der jeweils aktuelle Tab aktualisiert. Wie kann ich jetzt hier eine spezielle URL mit angeben.
Oder hat jemand von euch eine gänzlich andere Lösung?

Content-ID: 580508

Url: https://administrator.de/contentid/580508

Ausgedruckt am: 24.11.2024 um 07:11 Uhr

NordicMike
NordicMike 19.06.2020 um 20:18:52 Uhr
Goto Top
Aktiviere einfach das passende Autorefresh Addon :c) schneller und einfacher gehts nicht.
em-pie
em-pie 20.06.2020 aktualisiert um 07:55:25 Uhr
Goto Top
Moin,

Setze es als Meta direkt im Quellcode ein:
 <meta http-equiv="Refresh" content="5">   

Und wenn du das Parametrisieren willst, baue eine PHP-Funktion oder JS-Funktion drum herum, die das nur setzt, wenn du einen Parameter in der URL via GET übergibst...


Gruß
em-pie
colinardo
colinardo 20.06.2020 aktualisiert um 17:36:19 Uhr
Goto Top
Servus,
falls du weder Einfluss auf den Code der Seite hast, noch Plugins nutzen kannst wie du schreibst, lässt sich das auch über UIAutomation lösen.
Dafür habe ich hier eine c# EXE liegen der du per Parameter einen Tab-Titel übergeben kannst und dieser dann im FF aktualisiert wird.
Bei Interesse einfach per PN melden, dann stelle ich gerne die EXE und/oder den c# Quellcode zur Verfügung.

Man kann das ganze natürlich auch mit Powershell machen, guckst du (nur mit dem zur Zeit aktuellen Firefox 77.0.1 64bit [non ESR] getestet). Sollte es mit dem ESR bei dir nicht funktionieren, gib Bescheid, lässt sich ja alles anpassen.

Die URL für den Tab welcher aktualisiert werden soll steht in Zeile 82
function Get-FireFoxTabs(){
    [void][System.Reflection.Assembly]::LoadWithPartialName("UIAutomationClient")  
    [void][System.Reflection.Assembly]::LoadWithPartialName("UIAutomationTypes")  
    [void][System.Reflection.Assembly]::LoadWithPartialName("UIAutomationProvider")  
    [void][System.Reflection.Assembly]::LoadWithPartialName("UIAutomationClientsideProviders")  
    $cprovider = [System.Reflection.Assembly]::LoadWithPartialName("UIAutomationClientsideProviders")  
    try{
        [Windows.Automation.ClientSettings]::RegisterClientSideProviderAssembly($cprovider.GetName())
    }catch{
        [Windows.Automation.ClientSettings]::RegisterClientSideProviderAssembly($cprovider.GetName())
    }
    if (!("win32.tools" -as [type])){  
        Add-Type –MemberDefinition '  
            [DllImport("user32.dll")] public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, int lParam);  
            [DllImport("user32.dll")] public static extern bool SetForegroundWindow (IntPtr hWnd);  
            [DllImport("user32.dll")] public static extern IntPtr GetForegroundWindow();  

        ' -name "tools" -namespace Win32 | out-null  
    }
    $root = [System.Windows.Automation.AutomationElement]::RootElement

    
    Get-Process -Name firefox | %{
        $cond = New-Object System.Windows.Automation.PropertyCondition ([System.Windows.Automation.AutomationElement]::ProcessIdProperty,$_.Id)
        $window = $root.FindFirst([System.Windows.Automation.TreeScope]::Children,$cond)
        if ($window){
            $cond = New-Object System.Windows.Automation.PropertyCondition ([System.Windows.Automation.AutomationElement]::NameProperty,'Browser-Tabs')  
            $tabsbar = $window.FindFirst([System.Windows.Automation.TreeScope]::Children,$cond)
            if ($tabsbar){
                # find tabs
                $cond = New-Object System.Windows.Automation.PropertyCondition ([System.Windows.Automation.AutomationElement]::ControlTypeProperty,[System.Windows.Automation.ControlType]::TabItem)
                $tabs = $tabsbar.FindAll([System.Windows.Automation.TreeScope]::Descendants,$cond)

                # find addressbar object
                $cond = New-Object System.Windows.Automation.PropertyCondition ([System.Windows.Automation.AutomationElement]::NameProperty,'Navigation')  
                $urlbar = $window.FindFirst([System.Windows.Automation.TreeScope]::Children,$cond)
                if ($urlbar){
                    $cond = New-Object System.Windows.Automation.PropertyCondition ([System.Windows.Automation.AutomationElement]::ControlTypeProperty,[System.Windows.Automation.ControlType]::Edit)
                    $urlctl = $urlbar.FindFirst([System.Windows.Automation.TreeScope]::Descendants,$cond)
                }
                $tabs | %{    
                    # activate tab
                    $_.GetCurrentPattern([System.Windows.Automation.InvokePatternIdentifiers]::Pattern).Invoke()

                    # get url of tab
                    $url = ""  
                    if ($urlctl){
                        $url = $urlctl.GetCurrentPattern([System.Windows.Automation.ValuePattern]::Pattern).Current.Value
                    }
                        
                    $obj = [pscustomobject]@{
                        Tab = $_
                        URL = $url
                        Window = $window
                    }

                    $obj | Add-Member -MemberType ScriptMethod -Name Refresh -Value {
                        write-host "Refreshing tab with URL '$($_.URL)'." -F Green  
                        # activate tab
                        $_.Tab.GetCurrentPattern([System.Windows.Automation.InvokePatternIdentifiers]::Pattern).Invoke()
                        # Send F5 via Window-Message
                        [Win32.tools]::SendMessage($_.Window.Current.NativeWindowHandle,256,0x74,0) | out-null
                        [Win32.tools]::SendMessage($_.Window.Current.NativeWindowHandle,257,0x74,65539) | out-null
                    }

                    $obj | Add-Member -MemberType ScriptMethod -Name Activate -Value {
                        write-host "Activating tab with URL '$($_.URL)'." -F Green  
                        # activate tab
                        $_.Tab.GetCurrentPattern([System.Windows.Automation.InvokePatternIdentifiers]::Pattern).Invoke()
                    }
                    $obj
                }
            }
        }
    }
}

# get all tabs
$tabs = Get-FireFoxTabs
while($true){
    # refresh specific tab
    $tabs | ?{$_.URL -eq 'https://administrator.de/latest/'} | %{$_.Refresh()}  
    # sleep x seconds
    sleep 5
}

Grüße Uwe
chkdsk
chkdsk 20.06.2020 um 21:28:16 Uhr
Goto Top
Hi Zusammen,
Erstmal vielen Dank für eure Antworten.
Wie bereits erwähnt, ist die Installation von Addons etc. nicht möglich. Zugriff auf die Seite habe ich auch nicht, sodass ich diese nicht anpassen kann.

@uwe
Ich werde es am Montag mal mit deinem Powershell Skript versuchen und dann Rückmeldung geben. Ansonsten würde ich bestimmt auf dein C# Skript zurückgreifen.

Besten Dank nochmal und ein schönes Wochenende.
chkdsk
chkdsk 22.06.2020 um 07:20:37 Uhr
Goto Top
@uwe
ich habe dein Powershell Skript jetzt am laufen. Ein Refresh alle 5 Sekunden konnte ich leider nicht feststellen.
colinardo
colinardo 22.06.2020 aktualisiert um 07:38:18 Uhr
Goto Top
Wie gesagt nur mit NON-ESR getestet. Den ESR muss ich mir erst noch anschauen, sehr wahrscheinlich ist dessen interner GUI Aufbau anders.
Lass dir einfach mal die Variable $tabs ausgeben, wenn die leer ist dann muss es an den ESR angepasst werden.
chkdsk
chkdsk 22.06.2020 um 08:10:36 Uhr
Goto Top
Ja, ist leider leer face-sad
colinardo
colinardo 22.06.2020 aktualisiert um 18:14:54 Uhr
Goto Top
Nach eingehender Analyse verhält sich die ESR-Version im Gegensatz zum aktuellen Feuerfux leider ziemlich problematisch. Zwar ist der Aufbau(Benennung) hier etwas anders, die nötigen Änderungen sind kein Problem, aber der Refresh und das Auslesen der URL-Bar nach dem Aktivieren des jeweiligen Tabs ist momentan noch ein Problem bzw. sehr unzuverlässig, weswegen ich den momentanen Code für den ESR hier noch nicht poste. UI-Automation ist eben vielfach nur eine Krücke bei der man mit diversen Problemen zu kämpfen hat, gerade die Browser bekleckern sich hier oft nicht mit Ruhm. Habe aber im Moment zu wenig Zeit hier die Ursache zu lokalisieren weswegen ich das hier bei mir erst mal mit "very low prio" einstufen muss. Bei Zeiten schau ich vielleicht noch mal danach, aber im Moment passt das leider nicht mehr in meine Zeit-Slots, sorry.

Grüße Uwe
TK1987
TK1987 24.06.2020 um 17:39:20 Uhr
Goto Top
Moin,

Zitat von @chkdsk:
das funktioniert auch eigentlich ganz gut, allerdings wird nur der jeweils aktuelle Tab aktualisiert.
Wenn ich das richtig verstehe, willst du also mehrere Tabs aktualisieren? Man kann in Firefox mit Strg+Tab zum nächsten Tab wechseln.

Dementsprechend:
$wshell.SendKeys('^{TAB}')     # Zum nächsten Tab wechseln  

Alternativ kann man auch zu den Tabs 1-9 direkt mit Strg+Tabnummer wechseln, also
$wshell.SendKeys('^{1}')   # Zu Tab 1 wechseln  
$wshell.SendKeys('^{2}')   # Zu Tab 2 wechseln  
...

Gruß Thomas
chkdsk
chkdsk 25.06.2020 um 07:38:30 Uhr
Goto Top
Moin Uwe,

d as sich der ESR so schwer analysieren lässt ist natürlich blöd (in dem Fall für mich face-smile )Dennoch vielen Dank für deine Hilfe. Falls du es trotzdem zeitlich mal schaffen solltest, würd eich mich über eine Lösung freuen.
Aber vielleicht funktioniert ja deine C# exe?

Sonnige Grüße
chkdsk
chkdsk 25.06.2020 um 07:39:33 Uhr
Goto Top
Moin Thomas,

Ich habe mehrere Tabs offen aber möchte nur einen speziellen Tab aktualisieren.