如何做好一个购物网站,做家政公司网站,二级建造师证怎么考,移动云服务器背景由于要爬取的页面#xff0c;每个链接的请求都是点击之后js动态发起的#xff0c;目标数据也多是js动态生成的#xff0c;所以使用selenium工具webdriver(调试用的是chrome#xff0c;具体使用准备用phantomjs).模拟登录之后#xff0c;模拟查询之后#xff0c;得到如…背景由于要爬取的页面每个链接的请求都是点击之后js动态发起的目标数据也多是js动态生成的所以使用selenium工具webdriver(调试用的是chrome具体使用准备用phantomjs).模拟登录之后模拟查询之后得到如下列表可以看到链接是不能直接拿到的。接下去步骤是这样的得到链接的集合遍历集合点击链接得到对应的详情页面通过页面句柄转到详情页面拿到目标数据再转回父页面如上继续遍历问题按照如上逻辑在执行到遍历步骤的时候在第二次时报错了。第一种报错org.openqa.selenium.StaleElementReferenceException: stale elementreference: element is not attached to the page document我的代码// 获取查询按钮WebElement queryBtn driver.findElement(By.ByXPath.xpath(//*[id\mainContent\]/form/div[3]/div[13]/button[1]));// jse.executeScript(arguments[0].scrollIntoView(), queryBtn);scrollToElementAndClick(queryBtn);Thread.sleep(500); // 等待加载driver.manage().window().maximize();driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);int pageIndex Integer.parseInt(driver.findElement(By.xpath(//*[id\mainContent\]/div[2]/div[2]/div[1]/table/tfoot/tr[2]/td/div/ul/li[1]/span/font[3])).getText());int pageSize Integer.parseInt(driver.findElement(By.xpath(//*[id\mainContent\]/div[2]/div[2]/div[1]/table/tfoot/tr[2]/td/div/ul/li[1]/span/font[2])).getText());// Actions actions new Actions(driver);while (pageIndex pageSize) {pageIndex;WebElement tbody driver.findElement(By.ByXPath.xpath(//*[id\mainContent\]/div[2]/div[2]/div[1]/table/tbody));List links tbody.findElements(By.cssSelector(a[classng-binding]));for (WebElement link : links) {WebDriver window;System.out.println(-------------- voucherNo: link.getText());scrollToElementAndClick(link);// jse.executeScript(arguments[0].scrollIntoView(), link);// Thread.sleep(1000);// actions.moveToElement(link).click().perform();currentWindow driver.getWindowHandle();//get all windowsSet handles driver.getWindowHandles();for (String s : handles) {//current page is dont closeif (s.equals(currentWindow) || s.equals(parentWindow))continue;else {window driver.switchTo().window(s);window.manage().window().maximize();window.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);window.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);//get all tablesString pageSource window.getPageSource();String jsonArray parseDTO(pageSource);System.out.println(jsonArray);//close the table windowwindow.close();}//swich to current windowdriver.switchTo().window(currentWindow);}}// click next pageif (pageIndex pageSize) {WebElement nextPage driver.findElement(By.xpath(//*[id\mainContent\]/div[2]/div[2]/div[1]/table/tfoot/tr[2]/td/div/ul/li[3]/a));scrollToElementAndClick(nextPage);//set next page to current pagedriver driver.switchTo().window(driver.getWindowHandle());driver.manage().window().maximize();driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);}}我在stackoverflow上面查到过类似问题也去官网上面看到了对应报错的解释原因应该是我在跳转到子页面的时候父页面进行的刷新虽然在ui上面还能到那些链接但是集合里面的链接是原先定义的和遍历一次之后回来的父页面对应不上了。(我是这么理解的如果我理解错了请大神指出)。然后我就按照官方的建议每次页面去页面上拿链接而不是从原先定义的链接集合中拿。先说明每个链接的xpath都是有规律的如//*[idmainContent]/div[2]/div[2]/div[1]/table/tbody/tr[1]/td[2]/a//*[idmainContent]/div[2]/div[2]/div[1]/table/tbody/tr[2]/td[2]/a//*[idmainContent]/div[2]/div[2]/div[1]/table/tbody/tr[3]/td[2]/a//*[idmainContent]/div[2]/div[2]/div[1]/table/tbody/tr[%s]/td[2]/a这是我第二次的代码while (pageIndex pageSize) {pageIndex;WebElement tbody driver.findElement(By.ByXPath.xpath(//*[id\mainContent\]/div[2]/div[2]/div[1]/table/tbody));List links tbody.findElements(By.cssSelector(a[classng-binding]));int size links.size();for (int i 1; i size; i) {String href String.format(//*[id\mainContent\]/div[2]/div[2]/div[1]/table/tbody/tr[%s]/td[2]/a, i);WebElement link driver.findElement(By.xpath(href));WebDriver window;System.out.println(-------------- voucherNo: link.getText());scrollToElementAndClick(link);currentWindow driver.getWindowHandle();//get all windowsSet handles driver.getWindowHandles();for (String s : handles) {//current page is dont closeif (s.equals(currentWindow) || s.equals(parentWindow))continue;else {window driver.switchTo().window(s);window.manage().window().maximize();window.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);window.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);//get all tablesString pageSource window.getPageSource();String jsonArray parseDTO(pageSource);System.out.println(jsonArray);//close the table windowwindow.close();}//swich to current windowdriver.switchTo().window(currentWindow);}}// click next pageif (pageIndex pageSize) {WebElement nextPage driver.findElement(By.xpath(//*[id\mainContent\]/div[2]/div[2]/div[1]/table/tfoot/tr[2]/td/div/ul/li[3]/a));scrollToElementAndClick(nextPage);//set next page to current pagedriver driver.switchTo().window(driver.getWindowHandle());driver.manage().window().maximize();driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);}}这次报了第二种错误Caused by: org.openqa.selenium.NoSuchElementException: {errorMessage:Unable to find element with xpathEmm...试了很多种办法都没有用希望有大神能救救我万分感谢