使用WebDriverWait仍无法在执行next_page测试时获取新的page_source

时间:2018-10-30 04:10:10

标签: python selenium

我正在执行下一页测试。我单击下一页时使用循环捕获新数据。单击功能成功,但是似乎在执行next_page功能后driver.page_source没有更新。由于仍在循环中,因此代码将运行大约两次,然后可以对其进行更新。只是在极少数情况下它才能成功。

如果您这样使用,没关系:

NextPage()
time.sleep(2)
data=driver.page_source
currentpage = GetCurrentPage(data)

我知道driver.page_source将需要时间才能完全加载。但是,对于较大的页面总数,使用time.sleep()是很耗时的。然后,我尝试使用WebDriverWait等待Image类加载(此网站每页有很多图像),但这无济于事。

page=int(input("Please input page number:"))
if 1< page < 100:
    data=driver.page_source
    currentpage = GetCurrentPage(data)
    while True:
        if currentpage<page:
            try:
                CaptureData(data,file)
                print(currentpage)
                time.sleep(0.5)
                NextPage()
                # time.sleep(1)
                WebDriverWait(driver,5).until(EC.presence_of_element_located((By.CLASS_NAME,'J_ItemPicA')))
                data=driver.page_source
                currentpage = GetCurrentPage(data)
                print(currentpage)
            except TimeoutException:
                print("Timeout!")
            except Exception as e:
                print("Unexpected error!",e)
                break
        else:
            print('testa')
            CaptureData(data,file)
            break
elif page ==1:
    CaptureData(driver.page_source,file)

大多数情况下,以上代码的输出如下:

Please input page number: 2
1
1
1
2
testa

如果您可能需要GetCurrentPage代码:

def GetCurrentPage(data):
    soup=BeautifulSoup(data,'lxml')
    comments = soup.find_all("li", class_="item active")
    cp = re.findall('\d', comments[0].text)
    currentpage = int(''.join(cp))
    return currentpage

链接为there,但中文链接。

还有其他建议吗? 谢谢你一百万。

1 个答案:

答案 0 :(得分:0)

自己解决了问题。

使用WebDriverWait。获取当前页面,然后确定是否等于前一页加1。

代码如下:

   try:
        CaptureData(data, file)
        print(currentpage)
        time.sleep(0.5)
        NextPage()
        # time.sleep(2)
        element = WebDriverWait(driver, 10).until(EC.text_to_be_present_in_element(
            (By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > ul > li.item.active'),
            str(int(currentpage) + 1)))
        if element:
            data = driver.page_source
            currentpage = GetCurrentPage(data)
            print(currentpage)