Python Selenium mit JavaScript, sleep funktioiert nicht?

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
AstroCom
User
Beiträge: 8
Registriert: Sonntag 22. November 2020, 21:12

Hallo zusammen,

ich bin ein wenig Ratlos. ich würde gerne bei einer Webseite die Table alle zeilen anklicken lassen. Damit ich die Details auslesen kann. Dies mache ich mit Selenium(zusätzlich Javascript) und zwar so:

Code: Alles auswählen

#!/usr/bin/python3
from selenium import webdriver
#
#----///----
#
browser.execute_script("""
function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function demo() {
  console.log('Taking a break...');
  await sleep(2000);
  console.log('Two seconds later, showing sleep in a loop...');

  // Sleep in loop
  var el = document.getElementsByClassName('table__row table__row--details-trigger');
  for (var i=0;i<el.length; i++) {
  el[i].click();
      await sleep(200);
    console.log(i);
  }
}

demo();
""")
Leider geht das so schnell das er nur die ersten 25-40 Rows aufklappt aber nicht alle. Ich habe um keine zusätzliche Fehler einzubauen den code aus Stackoverflow kopiert: https://stackoverflow.com/questions/951 ... n-of-sleep dieser beschreib wie man einen sleep in einer for loop schleife einbaut. okey funktioiert auch wenn ich das in einer HTML Datei ausführer. Leider jedoch nicht in Python. habe ich da ein denkfehler oder warum führt Javascript den sleep nicht aus?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum willst Du das mit Javascript machen? Die Steuerung sollte von Python aus erfolgen.
AstroCom
User
Beiträge: 8
Registriert: Sonntag 22. November 2020, 21:12

nun das habe ich auch schon mal gemacht. in dem ich mit Selenium WebDriver gearbeitet habe. Leider jedoch werden die anklickbaren Elemente nicht freigegeben und ich muss deswegen JavaScript verweden. Erst wenn ich das Element mit JS anspreche, öffnet sich der Row. Aber das Problem liegt daran das die for schleife zu schnell ist. Und dann kommt als ergebnis, siehe Bild:Bild
ein nachtträgliches warten seits python, wo eventuell die Daten nachgeladen werden hilft nicht....
.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Da Du weder die Seite noch Deinen Code zeigst, kann man nur sagen, dass Du da was in Deinem Python-Code falsch gemacht hast. Allgemein, Du mußt so lange warten, bis die Daten nachgeladen worden sind.
AstroCom
User
Beiträge: 8
Registriert: Sonntag 22. November 2020, 21:12

Code: Alles auswählen

disp = Display(visible=0, size=(1420, 2020))
disp.start()
browser = webdriver.Firefox(executable_path='/root/webseitenscrappen/geckodriver')

browser.get("https://kunde.comdirect.de/lp/wt/login?execution=e1s1")
sleep(lt)
browser.save_screenshot("screenshot.png")
browser.find_element_by_xpath('//input[@id="param1Input"]').send_keys("00000000") #benutzer
browser.find_element_by_xpath('//input[@id="param3Input"]').send_keys("00000000") #passwort
sleep(lt-lt+1)
browser.find_element_by_xpath('//a[@id="loginAction"]').send_keys(Keys.ENTER)
sleep(lt+1)
browser.find_element_by_xpath('//button[@aria-label="Alle akzeptieren"]').click()
sleep(lt)
browser.find_element_by_xpath('//span[contains(text(), "Visa-Karte")]/..').click()
sleep(lt)
browser.find_element_by_xpath('//option[contains(text(), "90 Tage")]').click()
browser.find_element_by_xpath('//a[@class="button button--medium button--primary"]').click()
sleep(1)
# Klappe alle Umsätze auf (verlasse selenium, und nutze JavaScript)
body = browser.find_element_by_css_selector('body')
body.send_keys(Keys.PAGE_DOWN)
body.send_keys(Keys.PAGE_DOWN)
body.send_keys(Keys.PAGE_DOWN)
body.send_keys(Keys.PAGE_DOWN)
body.send_keys(Keys.PAGE_DOWN)
body.send_keys(Keys.PAGE_DOWN)
sleep(3)
print("bereit")
browser.execute_script("""
var el = document.getElementsByClassName('table__row table__row--details-trigger');
for (var i=0;i<el.length; i++) {
    el[i].click();
}
""")
print("fertig")
body = browser.find_element_by_css_selector('body')
body.send_keys(Keys.PAGE_DOWN)
sleep(100)
body.send_keys(Keys.PAGE_DOWN)

sleep(lt)
browser.save_screenshot("screenshot.png")
#print(browser.page_source)

onlineumsaetze = []
# speicher die tablle in einer liste
for row in browser.find_elements_by_xpath('//div[@class="table__container--scroll"]/table/tbody/tr'):
    data = [item.text.replace("\n"," ").replace("\xad","") for item in row.find_elements_by_xpath(".//*[self::td or self::th]")]
    onlineumsaetze.append(data)
Worum es mir geht ist das die webseite ein bisschen Zeit braucht um die ganzen Daten abzurufen. Das Laden hört einfach auf. Siehe nextes Bild:
Bild



ich würde gerne einfach das die For schleife einfach ein paar milisekunden wartet bevor er den

Code: Alles auswählen

 el[i].click();
ausführt...
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Aber warum Javascript?

Code: Alles auswählen

rows = browser.find_element_by_css_selector('.table__row.table__row--details-trigger')
for row in rows:
    row.click()
    sleep(1)
Natürlich würde man kein sleep benutzen, sondern einfach warten, bis das passende Unterelement angezeigt wird.
Antworten