[java] HtmlTextInput en HtmlPasswordInput uit HtmlForm

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Red devil
  • Registratie: December 1999
  • Laatst online: 13:55
Beste tweakerts,

Heb een web-scraper gebouwd die m.b.v. een opgeslagen user login/pass op een website inlogt en vervolgens bepaalde informatie download. De desbetreffende website is helemaal opnieuw gemaakt en nu werkt mijn code niet meer. Voorheen werkte dit:

code:
1
2
3
4
5
6
final HtmlPage page = webClient.getPage(this.login_url);
List<HtmlForm> forms_from_login_page = page.getForms();
HtmlForm form_from_login_page = forms_from_login_page.get(0);

HtmlTextInput userNameTextField = form_from_login_page.getInputByName("ctl00$MainContent$PublicLogin$LoginView1$Login1$UserName");
HtmlPasswordInput passwordTextField = form_from_login_page.getInputByName("ctl00$MainContent$PublicLogin$LoginView1$Login1$Password");


maar dat levert nu een:
Exception in thread "main" com.gargoylesoftware.htmlunit.ElementNotFoundException: elementName=[input] attributeName=[value] attributeValue=[ctl00$MainContent$PublicLogin$LoginView1$Login1$UserName]

De form wordt nog wel goed geextraheerd want als ik die naar Xml save krijg ik een form:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<form name="userInfoForm" ng-submit="$ctrl.signIn(userInfoForm)" novalidate="" class="ng-pristine ng-invalid ng-invalid-required">
  <div class="form-group">
    <div class="form-group">
      <!-- ngIf: $ctrl.responseModel.errorMessage -->    </div>
    <div class="form-group">
      <label class="sr-only">
        Username
      </label>
      <input id="kitnum-input" tabindex="1" type="text" class="form-control ng-pristine ng-untouched ng-empty ng-invalid ng-invalid-required" placeholder="Username" ng-model="$ctrl.kitNum" ng-change="$ctrl.onType(userInfoForm)" autofocus="" required=""/>
    </div>
    <div class="form-group">
      <label class="sr-only">
        Password
      </label>
      <input id="password-input" tabindex="2" type="password" class="form-control ng-pristine ng-untouched ng-empty ng-invalid ng-invalid-required" placeholder="Password" ng-model="$ctrl.password" ng-change="$ctrl.onType(userInfoForm)" required=""/>
    </div>
  </div>
  <div class="form-group text-center cta-space cta">
    <button id="sign-in-btn" type="submit" value="Sign in" data-style="zoom-in" class="btn btn-main btn-uppercase ladda-button" loading-data-button="" loading="false" ng-disabled="$ctrl.submitDisabled" disabled="disabled">
      <span class="ladda-label">
        Sign In
      </span>
      <span class="ladda-spinner">
      </span>
    </button>
  </div>
</form>


Enig idee hoe ik dit het beste kan benaderen? Wellicht via getByXPath ? Heb daar beetje mee gestoeid maar kwam niet echt veel verder....

Beste antwoord (via Red devil op 01-07-2017 08:55)


  • Merethil
  • Registratie: December 2008
  • Laatst online: 08-10 16:12
Bestaat er een getInputById ipv getInputByName? Want het lijkt erop dat de form elementen die je op wil halen geen name meer hebben, alleen nog een ID (voor name is het kitnum-input en voor password is het password-input).
Daarnaast vraag ik me af hoe lekker dit nog gaat werken, gezien het nu een AngularJS-website lijkt en de volledige frontend dus met Javascript gerenderd zal worden (gok ik zo).
Maar goed, probeer eerst bovenstaande eens zou ik zeggen.

Alle reacties


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 08-10 16:12
Bestaat er een getInputById ipv getInputByName? Want het lijkt erop dat de form elementen die je op wil halen geen name meer hebben, alleen nog een ID (voor name is het kitnum-input en voor password is het password-input).
Daarnaast vraag ik me af hoe lekker dit nog gaat werken, gezien het nu een AngularJS-website lijkt en de volledige frontend dus met Javascript gerenderd zal worden (gok ik zo).
Maar goed, probeer eerst bovenstaande eens zou ik zeggen.

Acties:
  • +1 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Als het een Angular app is zul je met iets als HtmlUnit ofzo aan de slag moeten gaan dat de JavaScript ook daadwerkelijk uitvoert. Of nog beter; kijk gewoon waar die site z'n data vandaan haalt en gebruik die API direct. Wat jij download is gewoon de basis HTML, de DOM die je ziet wordt in JavaScript opgebouwd.

Tip: check de officiele naming conventions: http://www.oracle.com/tec...deconventions-135099.html

Je gebruikt verschillende casing styles door elkaar heen. Voor variabelen wordt camelCase gebruikt en voor classnames PascalCase.

https://niels.nu


Acties:
  • 0 Henk 'm!

  • Red devil
  • Registratie: December 1999
  • Laatst online: 13:55
Merethil schreef op vrijdag 30 juni 2017 @ 23:11:
Bestaat er een getInputById ipv getInputByName? Want het lijkt erop dat de form elementen die je op wil halen geen name meer hebben, alleen nog een ID (voor name is het kitnum-input en voor password is het password-input).
Daarnaast vraag ik me af hoe lekker dit nog gaat werken, gezien het nu een AngularJS-website lijkt en de volledige frontend dus met Javascript gerenderd zal worden (gok ik zo).
Maar goed, probeer eerst bovenstaande eens zou ik zeggen.
Thanks, voorheen werkte ik via die Form en deze had geen getInputById. Door je opmerking toch verder gekeken en de bovenliggende pagina had deze functie wel, zo kon ik gelijk de boel ophalen!

Dit is dan de werkende code
code:
1
2
HtmlPage page = webClient.getPage(this.login_url);
HtmlTextInput userNameTextField = page.getHtmlElementById("id-van-ding");


Thanks!

Acties:
  • 0 Henk 'm!

  • Red devil
  • Registratie: December 1999
  • Laatst online: 13:55
Hydra schreef op zaterdag 1 juli 2017 @ 08:17:
Als het een Angular app is zul je met iets als HtmlUnit ofzo aan de slag moeten gaan dat de JavaScript ook daadwerkelijk uitvoert. Of nog beter; kijk gewoon waar die site z'n data vandaan haalt en gebruik die API direct. Wat jij download is gewoon de basis HTML, de DOM die je ziet wordt in JavaScript opgebouwd.

Tip: check de officiele naming conventions: http://www.oracle.com/tec...deconventions-135099.html

Je gebruikt verschillende casing styles door elkaar heen. Voor variabelen wordt camelCase gebruikt en voor classnames PascalCase.
Nu loop ik tegen het submitten aan en kijk ik eens beter naar jouw opmerking. Ik gebruik com.gargoylesoftware.htmlunit om de pagina te parsen/bewerken. Nu heb ik alle Text/Password fields and submit button gevonden, alleen wordt de .submit niet uitgevoerd. Lijkt erop dat dat gelinkt is aan jij al aanhaalde? Waarschijnlijk met de code loading="false" ng-disabled="$ctrl.submitDisabled" disabled="disabled" ?

Mijn casing styles zijn idd beetje rommeltje, ik hoef de code gelukkig niet te delen 8)