一、配置驱动与属性
我主要是使用谷歌的驱动,来模仿谷歌浏览器点击。
下载驱动地址:https://npm.taobao.org/mirrors/chromedriver/
选择版本要根据自己电脑的谷歌浏览器版本来决定下载(在右上角帮助点击关于Google)
//配置驱动路径 System.setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe"); //配置驱动属性 ChromeOptions chromeOptions = new ChromeOptions(); //不显示图片 chromeOptions.addArguments("blink-settings=imagesEnabled=false"); //浏览器最大化(不是全屏) chromeOptions.addArguments("--start-maximized"); // 打开或者关闭浏览器视图 chromeOptions.addArguments("--no-sandbox"); chromeOptions.addArguments("--disable-dev-shm-usage"); chromeOptions.addArguments("--headless"); //使用代理 chromeOptions.addArguments("--proxy-server=http://" + ip+端口); //创建一个google浏览器驱动,并且注入配置属性,这个时候会创建一个浏览器 WebDriver webDriver = new ChromeDriver(chromeOptions);
二、常用API
webDriver.get(url) 浏览器访问url地址 webDriver.quit() 退出浏览器 webDriver.findElements(By.xpath("")) 通过xpath返回指定标签,返回是list集合的 webDriver.findElement(By.xpath("")) 返回的是单个WebElement标签 webElement.getAttribute("href") 返回标签的属性value,例如<a href="value"></a> webElement.findElement(By.xpath("./")) 返回当前标签下的指定子标签,./指当前标签的xpathwebElement.click(); 点击标签,例如点击下一页按钮,选择按钮标签 跳到标签的位置,一般是为了防止未加载完全,跳到该标签再执行下一个操作 ((JavascriptExecutor) webDriver).executeScript("arguments[0].scrollIntoView();", webElement); //sendKeys相当于模拟键盘按键,并且可以实现组合按键,可参考:https://blog.youkuaiyun.com/weixin_44065501/article/details/89314538 webElement.sendKeys(Keys.UP); 所在标签向上滑一格 webElement.sendKeys(Keys.DOWN); 所在标签向下滑一格 webDriver.findElement(By.tagName("html")).sendKeys(Keys.END); 获取html的标签然后滑动到最下,一般为了加载全网页 webElement.sendKeys("输入框的内容"); 如果标签是输入框可以输入内容webElement.clear(); 如果标签是输入框可以清空输入内容 Actions actions = new Actions(webDriver); 浏览器的行为操作apiactions.moveToElement(webElement).click().perform(); 移动到指定标签并且点击操作(类似模拟鼠标) 切换到其他的iframe中再去使用xpath获取标签,一个页面可能存在不同的frame,需要切换frame才能获取到的标签,如果你发现xpath获取不到标签,这可能是其中一个原因 webDriver.switchTo().frame(webDriver.findElement(By.xpath("iframe")));
三、XPATH使用
最简单的方法就是直接在浏览器Elements > 选中标签右键 > Copy > CopyXPath中获取想要标签xpath,但是可能存在多个相同内容的网页xpath位置不固定,并且通过xpath去获取标签会出现存在多个的现象,很多时候我们需要找到一个稳定不变的并且唯一的xpath。
我们可以通过以下一些xpath规则组合获取指定标签:
//*[@class=\"value\"] 获取class=value的标签 //*[@id=\"value\"] 获取id=value的标签 //*[contains(@class,'value')] 获取class包含value的标签 //*[text()=\"value\"] 获取标签text内容是value的标签 //*[@class='value1'][text()=\"value2\"] []单个条件,组合条件获取class=value1并且内容是value2 //*[@id=\"value\"]/div[1]/div/span[2] 获取id=value下的第一个div下的div下的第二个span ./div 获取当前标签的下的div标签 //*a[last()] 获取a标签集合的最后一个,如果last()-1就是倒数第二个//*[@class=value]/.. 获取class=value的父级标签 //*[@class=\value\"]//a 获取class=value下的所有a标签 //:包含所有子标签 //*a[not (contains(@class,\"value\"))] 获取所有不满足class包含value的a标签