Javascript 在python selenium中使用ajax加载数据时如何滚动div
我正在Windows8中使用ChromeWebDriver开发python selenium。我遇到了一个在使用ajax滚动时加载数据的问题。 谁能给我一条正确的路走 编辑------------- 这是我在alecxe回答后的部分代码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[
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))