Kategorien
Wochenbericht

Wochenbericht 2021.32

  1. Apple’s Plan to “Think Different” About Encryption Opens a Backdoor to Your Private Life
  2. GitHub’s Engineering Team has moved to Codespaces
  3. For programmers, remote working is becoming the norm (Economist article)
  4. There Is No Benefit or Incentive for Developers to Create Quality Code on Software Projects
  5. The State Of Mobile First and Desktop First

Was zum Lachen: Astronauts use Linux…

Kategorien
Wochenbericht

Wochenbericht 2021.31

  1. Vue.js has been selected as Wikimedia Foundation’s future JavaScript framework
  2. Falsehoods Programmers Believe About Phone Numbers
  3. Ignorant managers cause bad code and developers can only compensate so much
  4. Apple’s Plan to “Think Different” About Encryption Opens a Backdoor to Your Private Life
  5. Webdriver und das Problem mit dem unsichtbaren Text.

Was zum Lachen: Outcome variables

Kategorien
Allgemein Webentwicklung Werkzeuge

Webdriver und das Problem mit dem unsichtbaren Text.

Neulich stand ich vor einem Problem, in dem ich mittels PHP-Webdriver versuchte, portentiell versteckten Inhalt aus einer Seite auszulesen.

Leider ist es so, dass das ganze nicht funktioniert, wenn der Inhalt versteckt ist. Dann wird zwar das Element gefunden, wenn man $element->getText() nutzt, wird aber null bzw ein leerer String ausgegeben. Das ist natürlich unschön und Webdriver selbst hat auch keine Möglichkeit, das DOM selbst zu verändern.

Aber natürlich gibt es einen Weg, dafür zu sorgen, dass man die Inhalte auslesen kann, immerhin muss das Element einfach nur sichtbar sein. Aber was, wenn das Element selbst nicht unsichtbar ist, sondern ein Eltern-Element das verursacht?

Hier die mögliche Lösung

PHP-Webdriver hat die Möglichkeit, einen Javascript-Codeblock an den Browser zu senden (analog zu browser.execute), der zweite Parameter von executeScript wird als arguments[] an die JS-Funktion übergeben. Damit bekommen wir das zu untersuchende Element.

In einer While-Schleife geht es dann (wenn ein Element nicht sichtbar ist) Element für Element nach oben. Dabei bekommt jedes einzelne Element ein display: block !important gesetzt.

Sobald ein überordnetes Element sichtbar ist, sind wir fertig. Eine while-Schleife stellt hier eine einfache Möglichkeit dar, den DOM-Tree rekursiv hochzuwandern.

Es besteht dabei auch die Möglichkeit, ein Element aus diesem Codeblock, der in eine Lambda-Funktion (auch “anonyme Funktion”) gepackt wird, zurückzugeben und das Element in PHP weiterzuverarbeiten. Allerdings müsste das Element dann zwischen den beiden Umgebungen ständig das Element für meine Schleifen hin- und hergereicht werden, das ist vermutlich weniger performant, als das einmal am Stück durchzugehen und das komplett in Javascript durchzuziehen, ohne vorher zurückzuspringen.

    /**
     * @param Client $client
     * @param RemoteWebElement $element
     * @throws \Exception
     */
    private function makeElementTreeVisible($client, $element): void
    {
        if (!$element->isDisplayed()) {
            $response = $client->executeScript('
                var element = arguments[0];

                function isVisible(elem){
                    return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length )
                    && window.getComputedStyle(elem).visibility !== "hidden";
                }

                while (!isVisible(element) ) {
                    element.setAttribute("style", "display: block !important")
                    element = element.parentNode;
                }
            ', [$element]);
        }
    }

Vermutlich nicht die super-perfomanteste Weise, aber zumindest sollten damit alle Edge Cases abgebildet sein.

Andere Möglichkeiten wären noch: den Style für alle Elemente setzen oder versuchen alle CSS-Styles zu entfernen (hilft halt nicht gegen Inline-Styles).

Habt ihr dieses Problem schon einmal gehabt? Wie habt ihr das gelöst?

Kategorien
Wochenbericht

Wochenbericht 2021.30

  1. Content-aware image resizing in JavaScript (using Seam Carving algorithm)
  2. For developers, Apple’s Safari is crap and outdated
  3. Building a breadcrumbs component
  4. Audioedtior Audacity: “Das mit der Datensammlerei, das war gar nicht so gemeint”
  5. The “with” keyword

Was zum Lachen: Fill in the gaps

Kategorien
Wochenbericht

Wochenbericht 2021.28

  1. Vue 3.2.0-beta.1
  2. Building a Conference Schedule with CSS Grid
  3. Build Complex CSS Transitions using Custom Properties and cubic-bezier()
  4. Collection of essential Vue Composition Utilities
  5. CSS Bookmarklets for Testing and Fixing
  6. Sa11y is an accessibility quality assurance tool that visually highlights common accessibility and usability issues. Geared towards content authors, Sa11y straightforwardly identifies errors or warnings at the source with a simple tooltip on how to fix them.

Was zum Lachen: Diese Woche nicht.