Selunium爬取网页 网页部分源代码
<h1 data-v-6cb98ece="" class="title">登录</h1>
<div data-v-6cb98ece="" class="input-group">
<div data-v-6cb98ece="" class="input-box">
<input data-v-6cb98ece="" name="loginPhoneOrEmail" maxlength="64" placeholder="请填写手机号或邮箱" class="input">
</div>
<div data-v-6cb98ece="" class="input-box"><input data-v-6cb98ece="" name="loginPassword" maxlength="64" placeholder="请输入密码" class="input" type="password">
</div>
</div>
<button data-v-6cb98ece="" class="btn">登录</button>
<div data-v-6cb98ece="" class="prompt-box">没有账号?
<span data-v-6cb98ece="" class="clickable">注册</span>
<a data-v-6cb98ece="" href="/reset-password" class="right clickable">忘记密码</a>
</div>
爬取Java源代码
System.setProperty("webdriver.gecko.driver",driverPath);
WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
driver.get("https://www.juejin.im");
driver.findElement(By.className("login")).click();
driver.findElement(By.tagName("input")).sendKeys("xxx");
driver.findElement(By.name("loginPassword")).sendKeys("xxx");
/*WebDriverWait wait=new WebDriverWait(driver,5);
wait.until(ExpectedConditions.visibilityOf(e));
e.click();*/
//JavascriptExecutor js = (JavascriptExecutor)driver;
//js.executeScript("arguments[0].click();", e);
WebElement e=driver.findElement(By.cssSelector("button.btn"));
e.click();
通过对原网页的分析,这个登陆表单是由js生成的
WebElement e=driver.findElement(By.cssSelector(“button.btn”));
网页上同为button.btn的匹配项没有找到,所以可能是父级元素导致的不可见,所以需要加上父级元素查找元素
更改成
WebElement e=driver.findElement(By.cssSelector(“div.panel button.btn”));
解决异常
还有其他同类异常的解决方法 ,https://stackoverflow.com/questions/3401343/scroll-element-into-view-with-selenium,但无法解决爬取这个网页的问题
另一个同样异常的网页解析
driver.get("http://www.qq.com/");//获取一个链接的网页元素
driver.findElement(By.className("login")).click();
//点击事件 可能存在cannot Scrolled into View 或 cannot locate element异常
//可以通过添加父元素 切换iframe 点击父元素以获得焦点的方法
//对于js未载入完全,可以通过等待或自执行js的方法
WebElement element=driver.findElement(By.id("ui_ptlogin"));
//关于弹出iframe内嵌窗口的问题解决方案
driver.switchTo().frame(element);
//极易发生以上错误
WebElement e=driver.findElement(By.cssSelector("div#login div#bottom_qlogin a#switcher_plogin"));
WebDriverWait wait=new WebDriverWait(driver,5);
wait.until(ExpectedConditions.visibilityOf(e));
e.click();
这个网页的登陆表单是iframe内嵌的