2015-10-13 15 views
9

Selen:Selen: Blättern Sie bis Ende der Seite

ich WebDriverJS neu bin. Ich habe diesen Ansatz in Java ausprobiert.

Long repaeted = 0l, scrollHeight = 0l, returnHeight = 0l; 
while(true){ 
    if (repaeted == 0) { 
     returnHeight = (Long) jse.executeScript("var scroll =document.documentElement.scrollHeight;window.scrollTo(0, scroll); return scroll;"); 
     System.out.println("Height : "+scrollHeight +"\t Chnage : "+returnHeight+ "\t Repeated : "+repaeted); 
     scrollHeight = returnHeight; 
    }else { 
     returnHeight = (Long) jse.executeScript("var scroll = document.documentElement.scrollHeight;window.scrollTo(0, scroll); return scroll;"); 
     System.out.println("Height : "+scrollHeight +"\t Chnage : "+returnHeight+ "\t Repeated : "+repaeted); 
     if (scrollHeight.intValue() == returnHeight.intValue()) { 
      System.out.println("Break.."+ returnHeight); 
      break; 
     } else { scrollHeight = returnHeight; } 
    } 
      repaeted++; 
} 

aber ich bin vor Problem in webdriverjs während der Schleife iteriert.

var webdriver = require('..'), 
    By = webdriver.By, 
    until = webdriver.until; 
// make sure chromedriver can be found on your system PATH 
var driver = new webdriver.Builder() 
    .forBrowser('chrome') 
    .withCapabilities(webdriver.Capabilities.chrome()) 
    .build(); 


driver.get('https://in.yahoo.com/').then(function(){ 
     var window = new webdriver.WebDriver.Window(driver); 
     window.maximize(); 
     driver.manage().timeouts().implicitlyWait(1000 * 3); 
    }) 
    .then(function(){ 
     console.log('Entered'); 
     var check = 0, count = 0 
     for(var i = 0; i< 50; i++){ 
     //driver.sleep(1000 * 2); 
driver.executeScript('var dynamicscroll = document.documentElement.scrollHeight;window.scrollTo(0, dynamicscroll);return dynamicscroll;').then(function(height){ 
     console.log('Check : '+check+' Height : '+height +' Repeated : '+(count++)); 
     if(check === 0 || check !== height){console.log('continue'); check = height; } 
     else { console.log('break'); i = 100; } 
      }); 
     } 
     }) 
    .then(null, function(err) { 
     console.error("An error was thrown! By Promise..." + err); 
    }); 

driver.quit(); 

In meinem Code ich fest einprogrammiert haben für Schleife bis 50-mal zu wiederholen, und ich möchte die Schleife beenden/brechen, wenn die Scroll-Höhe bis zum Ende erreicht ist. In diesem Ansatz möchte ich Hardcode wie Java-Code entfernen, weil Ich weiß nicht, wie oft für andere Anwendungen, deren Scroll dynamisch weiter erhöht wird zu iterieren. zum Beispiel Facebook-Anwendung, Yahoo News ...

Antwort

5

Das Blättern am unteren Rand einer dynamischen Seite kann je nach Implementierung auf der Seite eine Herausforderung darstellen.

Zuerst müssen Sie den Container mit der Bildlaufleiste finden, da dieser sich von dem mit window.scrollTo verknüpften unterscheiden kann.

Scrollen Sie dann den Container, indem Sie scrollTop erhöhen, bis die scrollHeight stabil wird und keine Anforderungen mehr anstehen. Um zu überprüfen, ob ausstehende Anforderungen vorhanden sind, evaluieren Sie entweder jQuery.active, wenn die Seite über JQuery verfügt, oder haken Sie XMLHttpRequest, um die Aufrufe unter send zu überwachen. Hier

ist ein Beispiel für eine generische Funktion zum unteren Rand der Seite mehrere Male blättern oder bis zum Ende:

var webdriver = require('selenium-webdriver'); 

var driver = new webdriver.Builder().forBrowser('chrome').build(); 

driver.get('https://groups.google.com/forum/#!search/webdriverjs'); 

// scroll to the bottom 3 times 
driver.executeAsyncScript(scrollBottom, 3) 
    .then(n => console.log(`scrolled ${n} time(s)`)); 

// scroll to the bottom until the end 
driver.executeAsyncScript(scrollBottom) 
    .then(n => console.log(`scrolled ${n} time(s)`)); 
function scrollBottom(){ 
    var count = arguments[arguments.length - 2] || 0x7fffffff; 
    var callback = arguments[arguments.length - 1]; 

    /* get the scrollable container */ 
    var elm = document.elementFromPoint(window.innerWidth - 25, window.innerHeight/2); 
    for (;elm && (++elm.scrollTop, !elm.scrollTop); elm=elm.parentElement); 
    elm = elm || document.documentElement; 

    /* hook XMLHttpRequest to monitor Ajax requests */ 
    if (!('idle' in XMLHttpRequest)) (function(){ 
    var n = 0, t = Date.now(), send = XMLHttpRequest.prototype.send; 
    var dispose = function(){ --n; t = Date.now(); }; 
    var loadend = function(){ setTimeout(dispose, 1) }; 
    XMLHttpRequest.idle = function() { return n > 0 ? 0 : Date.now() - t; }; 
    XMLHttpRequest.prototype.send = function(){ 
     ++n; 
     this.addEventListener('loadend', loadend); 
     send.apply(this, arguments); 
    }; 
    })(); 

    /* scroll until steady scrollHeight or count of scroll and no pending request */ 
    var i = 0, scrollHeight = -1, scrollTop = -1; 
    (function scroll(){ 
    if ((scrollHeight === elm.scrollHeight || i === count) && XMLHttpRequest.idle() > 60) 
     return callback(i); 
    scrollTop = elm.scrollTop; 
    scrollHeight = elm.scrollHeight; 
    if (i < count) 
     i += (elm.scrollTop = 0x7fffffff, scrollTop !== elm.scrollTop); 
    setTimeout(scroll, 100); 
    })(); 
} 

oder durch Scrollen, bis die Höhe nicht mehr während erhöht eine bestimmte Zeit (5 Sekunden hier):

function scrollBottom(){ 
    var count = arguments[arguments.length - 2] || 0x7fffffff; 
    var callback = arguments[arguments.length - 1]; 
    var timeout = 5000; /* 5 seconds timeout */ 
    var i = 0; 

    /* get the scrollable container */ 
    var elm = document.elementFromPoint(window.innerWidth - 25, window.innerHeight/2); 
    for (;elm && (++elm.scrollTop, !elm.scrollTop); elm=elm.parentElement); 
    elm = elm || document.documentElement; 

    /* scroll while the height is increasing or until timeout */ 
    (function scroll(){ 
    var endtime = Date.now() + timeout; 
    var height = elm.scrollHeight; 
    elm.scrollTop = 0x7fffffff; /* scroll */ 

    setTimeout(function check(){ 
     if (Date.now() > endtime)   /* returns if waited more than 5 sec */ 
     callback(i); 
     else if (elm.scrollHeight == height) /* wait again if same height */ 
     setTimeout(check, 60); 
     else if (++i === count)    /* returns if scrolled the expected count */ 
     callback(i); 
     else         /* scroll again */ 
     setTimeout(scroll, 60); 
    }, 250); 
    })(); 
} 
+0

Können Sie mit dieser URL überprüfen: 'https: // in.yahoo.com /'. und meine Frage ist, ich möchte nur die Schleife zu brechen, wenn es zu Ende mit 'webdriverjs.' kommt, welche URL, die Sie überprüft haben enthält' div scroll'. – Yash

+0

@Yash, es funktioniert mit https://in.yahoo.com/. Ihre Frage ist, wie man bis zum Ende einer Webseite blättert, wenn die Scrollhöhe dynamisch ansteigt, was genau das ist, was dieses Beispiel mit 'webdriverjs' macht. Ich fügte ein anderes Beispiel hinzu, das scrollt, bis die Höhe nicht mehr während einer bestimmten Zeit ansteigt. –

+0

Können Sie überprüfen, dass Sie Code ist Fehler "ScriptTimeoutError: asynchrones Skript-Timeout: Ergebnis wurde nicht in 0 Sekunden" jedes Mal während der Ausführung erhalten. – Yash

1

reine JavaScript:

In JavaScript können wir setTimeout() Funktion verwenden. Das ruft die angegebene Funktion rekursiv nach der von Ihnen angegebenen Zeitverzögerung auf.

Ich habe die Google Groups-Anwendung getestet, deren div Tag vertikale Scroll dynamisch erhöht. Um den Inhalt zu laden, habe ich die Zeitverzögerung von 5000 verwendet. Sie können diesen Code in der Browserkonsole testen, indem Sie diese URL verwenden: https://groups.google.com/forum/#!search/webdrierjs.

var i = 0, height = 0, check = 0, t = null; 
flow(); 

function run(arg){ 
var objDiv = document.querySelector('div.IVILX2C-b-F'); 
objDiv.scrollTop = objDiv.scrollHeight; 
return objDiv.scrollHeight; 
} 

function flow() { 
i++; 
    switch(i){ 
     case 0:  height = run(i); 
        sleep(5000); 
       break; 
     case -1: run(i); 
        clearTimeout(t); //stops flow 
       break; 
     default: check = run(i); 
        console.log('Return Height : '+check +' Count : '+i); 
        if(check === height){ i = -2; 
        console.log('Break message : '+i); 
        }else { 
        console.log('Changed...'); 
        height = check; 
        } 
       sleep(5000); 
       break; 
    } 
} 

function sleep(delay) { t=setTimeout("flow()",delay);} //starts flow control again after time specified. 
//function sleep(delay) { var start = new Date().getTime();  while (new Date().getTime() < start + delay); flow(); } // stops execution and then continues. 

aber auch ich kann nicht dieses Skript ausführen mit WebDriver/WebDriverJS, weil es nicht geht rekursive Funktion auf Zeitverzögerung nennen.

+0

Dieser Code erzeugt einen Fehler, wenn er im strikten Compliance-Modus verwendet wird ("t" ist global). –

+0

@ A Red Herring danke): - jetzt änderte ich t als lokale Variable var t = null; und getestet !. jetzt erhöht sich das 'i' richtig. – Yash

0

aus Erfahrung ist der schnellste Weg zum Ende einer Seite blättern für das Fußzeile Element und movetoit zu suchen, in der Regel #footer oder .footer oder nur footer Selektor wird es tun. Z.B.:

footer = driver.findElement({id: "footer"}); 
driver.executeScript("arguments[0].scrollIntoView(false);", footer); 

Im Falle von ‚endlosen‘ Ströme wie Facebook, Twitter, etc. Sie können Sie sperren, wenn Sie eine Grenze erreicht, so dass es max Iterationen kombinieren mit window.scrollTo(0, 300); rekursiv und warten Sie einige Sekunden nach jeder Scroll ist okay .

0

diesen Code versuchen - seine Arbeits in Python (nur in Ihrem Fall übersetzen):

# Get scroll height. 
    last_height = self.driver.execute_script("return document.body.scrollHeight") 

    while True: 
     # Scroll down to the bottom. 
     self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") 

     # Wait to load a page. 
     time.sleep(2) 

     # Calculate new scroll height and compare with last scroll height. 
     new_height = self.driver.execute_script("return document.body.scrollHeight") 
     if new_height == last_height: 
      break 
     last_height = new_height 

BTW: Hier ist ich JavaScript aus Python leite.

Verwandte Themen