Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在python selenium中使用ajax加载数据时如何滚动div_Javascript_Python_Selenium_Selenium Webdriver_Web Scraping - Fatal编程技术网

Javascript 在python selenium中使用ajax加载数据时如何滚动div

Javascript 在python selenium中使用ajax加载数据时如何滚动div,javascript,python,selenium,selenium-webdriver,web-scraping,Javascript,Python,Selenium,Selenium Webdriver,Web Scraping,我正在Windows8中使用ChromeWebDriver开发python selenium。我遇到了一个在使用ajax滚动时加载数据的问题。 谁能给我一条正确的路走 编辑------------- 这是我在alecxe回答后的部分代码 nam = driver.find_element(By.CLASS_NAME ,'_wu') #get length of review revcnt = driver.find_element(By.XPATH ,"//span[

我正在Windows8中使用ChromeWebDriver开发python selenium。我遇到了一个在使用ajax滚动时加载数据的问题。

谁能给我一条正确的路走

编辑-------------

这是我在alecxe回答后的部分代码

    nam = driver.find_element(By.CLASS_NAME ,'_wu')

    #get length of review
    revcnt = driver.find_element(By.XPATH ,"//span[@class='_Mnc _yz']")
    revcnt = int(revcnt.text.replace(" reviews","").strip())
    print revcnt
    # wait for reviews to appear
    wait = WebDriverWait(driver, 10)
    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "span.review-snippet")))
    #reviews=[]
    while True:
        reviews = driver.find_elements_by_css_selector("div._ju")
        if len(reviews)<revcnt:
            driver.execute_script("arguments[0].scrollIntoView();", reviews[-1])
        else:
            driver.quit()
        print len(reviews)
nam=driver.find\u元素(By.CLASS\u名称,“\u-wu”)
#获取评论的长度
revcnt=driver.find_元素(By.XPATH,“//span[@class=”\u Mnc\u yz']))
revcnt=int(revcnt.text.replace(“reviews”,”).strip())
打印版本
#等待评论出现
wait=WebDriverWait(驱动程序,10)
等待.until(位于((By.CSS\u选择器,“span.review snippet”))的元素的EC.visibility\u)
#评论=[]
尽管如此:
reviews=驱动程序。通过css选择器(“div.\u ju”)查找元素

如果len(reviews)做一个循环,在每次迭代中滚动到列表中最后一个“review”的视图(对我有用):

请注意,这里的循环是无止境的-您需要弄清楚如何退出循环。例如,您可以在滚动到视图之前和之后统计评论,如果没有加载更多评论,则退出循环。或者,您可以检查旋转圈是否存在。一旦它没有显示在滚动条上-这意味着没有更多的评论加载左

以下是检测不再加载评论的方法之一-检查下一次滚动后评论对话框的滚动高度是否没有改变-这接近人类检测的方式:

dialog = driver.find_element_by_css_selector("div.review-dialog-list")
last_scroll_height = 0

while True:
    reviews = driver.find_elements_by_css_selector("div._ju")
    driver.execute_script("arguments[0].scrollIntoView();", reviews[-1])

    # adding artificial delay (don't tell anyone I'm using sleep here)
    time.sleep(1)

    # if scroll height has not changed - exit
    scroll_height = driver.execute_script("return arguments[0].scrollHeight;", dialog)
    if scroll_height == last_scroll_height:
        break
    else:
        last_scroll_height = scroll_height

print(len(reviews)) 

我不喜欢有
时间。sleep()
在这里,希望你能有更好的想法来解决这个问题。

谢谢,你能告诉我如何退出循环吗,因为评论长度随其他链接而变化,因此我不知道长度。无法逃避while循环!我使用计数器退出循环,但徒劳…@SAZ是的,这有点棘手,我已将此问题添加到我的待办事项列表中。稍后会给你回复。谢谢@alecxe-count不起作用,因为它并非适用于所有url,例如,上面的链接有124名审阅者(实际上),但125名审阅者写在网页上。重新标记此页具有正确的计数。我认为最好尝试旋转树的存在,但如何跟踪一个短暂的元素???@SAZ更新了一个选项,如果没有加载新的评论,就停止滚动。
dialog = driver.find_element_by_css_selector("div.review-dialog-list")
last_scroll_height = 0

while True:
    reviews = driver.find_elements_by_css_selector("div._ju")
    driver.execute_script("arguments[0].scrollIntoView();", reviews[-1])

    # adding artificial delay (don't tell anyone I'm using sleep here)
    time.sleep(1)

    # if scroll height has not changed - exit
    scroll_height = driver.execute_script("return arguments[0].scrollHeight;", dialog)
    if scroll_height == last_scroll_height:
        break
    else:
        last_scroll_height = scroll_height

print(len(reviews))