Allegro Seller Info 0.1.15
• tech • 292 słowa • 2 minuty czytania
Po 3 dniach kolejne wydanie allegrowego skryptu użytkownika, bo dziś znów coś na stronie uległo zmianie…
Na listach ofert przestały wyświetlać się informacje o sprzedającym. Na szybko ustaliłem, że zmieniono coś w strukturze i identyfikatorach elementów. Nie ma już kontenera #opbox-listing--base
, za to jest .opbox-listing
. Niestety elementów z taką klasą jest więcej, więc nie będzie to prosta aktualizacja selektora.
Tym razem trzeba dodać trochę więcej kodu, bo interesuje mnie ten kontener, w którym to znajdują się oferty zapakowane w <article/>
. Gdyby przeglądarki wspierały już pseudo-klasę :has()
, to pewnie taki selektor mógłby zadziałać:
// strona z lista aukcji
const listing = document.querySelector('.opbox-listing:has(article)');
Niestety nie ma lekko i trzeba to zrobić po staroświecku. Co nie znaczy, że nie da się tego zwięźle zapisać ;)
// strona z lista aukcji
const listing = Array.prototype.filter.call(
document.getElementsByClassName('opbox-listing'),
e => e.getElementsByTagName('article').length > 0
).pop();
Poprzednio (0.1.15) wprowadzone poprawki z pobieraniem lokacji użytkownika na stronach ofert nie do końca spełniają swoją rolę. W pewnych okolicznościach cała zawartość innerText
wpada do zmiennej.
Pomyślałem, że skoro te elementy od dawna generowane i wyświetlane są jako warstwy, to może jakiś react-owy komponent w tym uczestniczy i z jakiś “propsów” wydobędę “czyste” dane bez zabawy w parsowanie i regex-y… no i znalazłem!
// pobierz lokalizacje z Opcji dostawy
var node = document.getElementsByClassName('opbox-showoffer-delivery')[0].firstElementChild;
var item = getReactInst(node);
if (!item || !item.pendingProps || !item.pendingProps.offerLocation)
return;
var loc = item.pendingProps.offerLocation;
if (loc.endsWith(', Polska'))
loc = loc.substr(0, loc.length - 8);
Kod do pobierania instancji komponentu Reacta wrzuciłem do osobnej funkcji (getReactInst
), która zwraca obiekt spod pola return
. Wydaje się to lepsze niż return.stateNode
, gdyż nie zawsze jest on dostępny i podobnie jak props
i pendingProps
niekoniecznie zawiera jakieś dane. A tak będzie można specyfikować “ścieżkę” zależnie od potrzeb.
Nowa wersja dostępna jest już w moim gicie UserScripts.
Komentarze (0)