Wpis z mikrobloga

#qa
#testowanieoprogramowania

Mirki, mam dziwny case do automatyzacji w pracy.

Mianowicie mam zebrać wszystkie paragrafy z cytowanych wypowiedzi na webapce i potem to wyeksportować do jsona.

Use case jest taki, że mamy w produkcie opinie użytkowników i chcemy walidowac te wypowiedzi z naszym CMS.

Jak w strukturze DOM
Imię "cytat"



Które są pod class="nazwaklasy"

Wyciągnąć wszystkie wartości, które mają cudzysłów?

Używamy js i Cypressa jako framework, próbuje to zrobić przez cy.get().contains ("").then

I potem czytać wartość ale nie działa
  • 14
Teraz udało mi się to wrzucić w pętlę

let allParagraphs = document.getElementByTagName('p')

for (let i = 0; i < allParagraphs.length; i++) { console.log(allParagraphs[1]) }

To zwraca mi wszystkie

Teraz muszę dodać jakiś trim, który będzie rozpoznawał " " jako coś co mnie interesuje. Tutaj musze to jakoś regexem zrobić?
@henk: wlasnie nie chce na sztywno tego robic.

Chcialbym cos takiego:

znalezc wszystkie elementy , potem to przeksztalcic w tekst i iterowac po kazdym w ktorym znajde wyrazenie regex z tym cudzyslowem

No i generalnie nie wiem jak to napisac, bo mam document.querySelectorAll('p')
via Wykop Mobilny (Android)
  • 0
@milvanb: co to znaczy na sztywno? co to za różnica, czy weźmiesz wszystkie paragrafy xpathem, czy CSS selektorem? Żadna. Za tą xpath od razu pozwala ci znaleźć tylko te nody z cudzyslowiem //p[contains(text(), '"')]

No i w ogóle to bez sensu brać wszystkie paragrafy, skoro interesują cię tylko te, które mają jakąś klasę, czy tam jakiś ich rodzic ma konkretną klasę.
@henk: w sumie z tej strony na to nie patrzyłem. Chodziło mi o to, że możnaby zrobić coś takiego, że iterujemy po domie w poszukiwaniu wszystkich "", bez tego zagnieżdżania w . I wtedy niezależnie jak dev by napisał atrybuty, wtedy bankowo będzie działało
@milvanb: no przelatujesz po kolekcji tych webelementów i wywołujesz na nich element.getText().match('".+"')[0] czy tam innerText zamiast getText() bo nie wiem co tam w cypresie jest do zbierania tekstu z webelementu.

A jak element jest bardziej skomplikowany, że innerText nie zwraca tego co chcesz, to zawsze możesz użyć .childNodes[i].nodeValue
@el_doopa: weź tak -
- pobierz kolekcję wszystkich elementów z klasą "class="nazwaklasy""
- przefiltruj ją pod kątem spełniania warunku element posiada dziecko lub sam posiada ciąg znaków który #!$%@? coś na takim regexpie "([^"]*)"

to będzie:

const matchedParagraphs =
[...document.getElementsByClassName("toggle")]
.filter(par => par.outerText.match(new RegExp('"([^"]*)"')) })