我正在窗口 8 中使用 chrome webdriver 开发 python selenium。我遇到了 page在使用 ajax 滚动时加载数据。我尝试注入(inject) jquery以下链接对我不起作用。 Link 1 Link 2 Link 3
谁能给我一条正确的道路。
编辑----------------
这是我在 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)
但是从 while 循环中逃脱的问题!
我试过了 it .
最佳答案
做一个循环,在每次迭代时滚动到 View 列表中的最后一个“评论”(对我有用):
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://www.google.com/search?q=a1%20plumbing%20boise&gws_rd=ssl#gws_rd=ssl&lrd=0x54aeff4cb0b24461:0x23720b81e2bed658,1")
# wait for reviews to appear
wait = WebDriverWait(driver, 10)
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "span.review-snippet")))
while True:
reviews = driver.find_elements_by_css_selector("div._ju")
driver.execute_script("arguments[0].scrollIntoView();", reviews[-1])
请注意,这里的循环是无限的——您需要弄清楚如何退出循环。例如,您可以计算滚动到 View 之前和之后的评论数,如果没有加载更多评论,则退出循环。或者,您可以检查旋转的圆圈是否存在。一旦它没有显示在滚动条上 - 这意味着不再需要加载评论。
这是检测没有更多评论要加载的想法之一 - 检查下一次滚动后评论对话框的滚动高度是否没有改变 - 这接近于人类检测它的方式:
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))
我不喜欢这里有 time.sleep()
,希望你有更好的主意来解决这个问题。
关于javascript - 在python selenium中使用ajax加载数据时如何滚动div,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32619106/