Selenium 官方网站
Selenium 教程
Jar http://selenium-release.storage.googleapis.com/index.html
学好前端知识也很重要。JavaScript W3School
Selenium 调用IEDriverServerIE浏览器
Selenium WebDriver中常用到的JavaScript操作
import org.openqa.selenium.JavascriptExecutor;
method | 详情 |
---|---|
executeScript | 同步方法,用它执行js代码会阻塞主线程执行,直到js代码执行完毕; |
executeAsyncScript | 异步方法,它不会阻塞主线程执行。 |
操作滚动条
垂直滚动
String scroll = "document.documentElement.scrollTop=" + "y";
JavascriptExecutor js=(JavascriptExecutor) driver;
js.executeScript(scroll);
滚动条式
String scroll = "document.getElementById("location").scrollLeft=x";
JavascriptExecutor js=(JavascriptExecutor)driver;
js.executeScript(scroll);
js.executeScript("scrollTo(0,10000)");
WebElement e = findElement(locator.getLocator(name));
js.executeScript("arguments[0].scrollIntoView(true)", e);
操作文本
String text = "text"; //输入的内容
String js = "var sum=document.getElementById('id');
sum.value='" + text + "';";
((JavascriptExecutor)driver).executeScript(js);
操作视频
JavascriptExecutor js=(JavascriptExecutor) driver;
//获取视频url js.executeScript("return arguments[0].currentSrc;",video);
//播放视频 js.executeScript("return arguments[0].play()", video);
//暂停视频 js.executeScript("arguments[0].pause()", video);
String command="document.getElementById().style.buttom="0""
JavescriptExecutor js=(JavescriptExecutor) driver;
js.JaveScript(command);
ScriptEngine ,java 有支持调用js的解析引擎。
Selenium Webdriver 的使用java执行js代码 解决 ScriptEngine不支持浏览器内置对象
ScriptEngineManager manager = new ScriptEngineManager();
List<ScriptEngineFactory> factories = manager.getEngineFactories();
for (ScriptEngineFactory f : factories) {
System.out.println(f.getEngineName());}
ScriptEngine 本身 不带浏览器内核,那么就需要去找其他解析引擎;
什么是浏览器内核?
HtmlUnitDriver,IE,Firefox, Chrome
谷歌驱动和和浏览器的版本对照及下载 http://chromedriver.storage.googleapis.com/index.html
1..获取js渲染后的网页源代码
driver.page_source
2.获取cookie
driver.get_cookies()
3.selenium本身自带幽灵浏览器/无头浏览器,如何设置无头浏览器呢?
options = webdriver.FirefoxOptions()
options.headless = True(开启无头)
driver = webdriver.Firefox(firefox_options=options)
4.driver.close()与driver.quit()的区别
driver.close(): 关闭当前driver操作的窗口,其他窗口不会关闭。
driver.quit(): 将driver浏览器对象退出,所有相关联窗口都会关闭。
driver.manage().window().maximize();
driver.manage().window().setSize(new Dimension(480,800));
//执行浏览器后退
driver.navigate().back();
//执行浏览器返回
driver.navigate().forward();
alert、confirm 、类似alert的div布局
https://blog.csdn.net/huilan_same/article/details/52298460
switch_to.alert , accept() , text Alert(driver) , dismiss()
- 只能通过window的name来切换窗口,但window的name不是你想象的窗口title之类的,而是一串字符串,如‘{976ae257-19be-4b32-a82e-4ba5063ed0a2}’,所以你用title、url之类的想切window是不可能的
- 关闭了新窗口之后,driver并不会自动跳转回原窗口,而是需要你switch回来,直接去定位窗口元素会报NoSuchElementException 失去焦点
抓取元素 ifream freamset 标签
public void switchFrameByIndex(int frameIndex) {
driver.switchTo().defaultContent();
driver.switchTo().frame(frameIndex);}
selemnium 元素查找
元素定位 具有相同的ID名称,按照层级定位,尽量避免一次性定位。否则找不到元素。即使是 findElement(By.id)
下拉框元素定位
- selectByIndex() 根据索引来选取,从0开始
- selectByValue() 根据属性value的属性值来选取
- selectByVisibleText()根据标签之间的Text值,也就是页面显示的
下拉框定位 select 类型 复合型class
选择对应元素
WebElement job = driver.findElement(By.id("classname"));
Select downList= New Select(job);
downList.selectByIndex(2);
downList.selectByValue(2);//指的是 select <option value="hongse">红色</option>中的value而不是红色
downList.selectByText(2);
取消选择对应元素
if(downList.isMultiple)//判断是否是多选的下拉列表
downList.deselectByIndex(2);//只能够应用在多选下拉列表
下拉列表操作
List<String> List=downList.getAllSelectedOptions()//只能够应用在多选下拉列表 并不是显示所有option中的值
for(WebElement option:List){
option.getText();
}
downList.getFirstSelectedOption().getText()
多窗口的处理
String handle = driver.getWindowHandle();
窗口handle并不是按照打开顺序产生的,每一次都是会有变化的,可以通过窗口title来进行窗口定位。
winNum = getCurrentWindowsNumber();
for (int i = 0; i < winNum; i++) {
String title = switchWindowGetTitle(i);
if (title.equalsIgnoreCase("XXXXXX")) {
this.swiththiswindow(i);
break;
}
}
public void swiththiswindow(int windowid) {
Set<String> winHandels = driver.getWindowHandles(); // 得到当前窗口的set集合
List<String> it = new ArrayList<String>(winHandels); // 将set集合存入list对象
if (windowid < winHandels.size()) {
driver.switchTo().window(it.get(windowid)); // 切换到弹出的新窗口
String title = driver.switchTo().window(it.get(windowid)).getTitle();
}
}
文件上传以及头像更换
大部分都是以 Input 类型为主
driver.findElement(By.id("upload")).sendKeys("photo path")
模拟鼠标操作 与Click区别
左击 Action actioin = New Action(driver) Action.click().perform()
右击 Action actioin = New Action(driver) Action.contextClick().perform()
双击 Action actioin = New Action(driver) Action.DoubleClick().perform()
悬停 Action actioin = New Action(driver) Action.moveToElement().perform()
selemnium 与 Ajax
基本上都是等待页面元素出现进行判别。
implicitly_wait()隐式等待和explicit_wait()显示等待
1、显式等待(如果10s没有找到元素则报错)
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
2、隐式等待(设置10s超时时间)
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
区别:
Selenium显示等待和隐式等待的区别
1、selenium的显示等待
原理:显示等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内 都没找到,那么久跳出Exception
(简而言之,就是直到元素出现才去操作,如果超时则报异常)
2、selenium的隐式等待
原理:隐式等待,就是在创建driver时,为浏览器对象创建一个等待时间,这个方法是得不到某个元素就等待一段时间,直到拿到某个元素位置。
注意:在使用隐式等待的时候,实际上浏览器会在你自己设定的时间内部断的刷新页面去寻找我们需要的元素
3、笨方法等待
使当前线程进入等待,Thread.sleep();这种等待属于死等,很容易让线程挂掉,使程序抛异常,所以要慎用此方法
3、截图
IWebDriver driver;
string baseURL;
baseURL = @"https://accounts.english.ctrip.com/signin/";
driver = new InternetExplorerDriver();
driver.Navigate().GoToUrl(baseURL);
Screenshot ss= ((InternetExplorerDriver)driver).GetScreenshot();
ss.SaveAsFile("aaaaa.png",System.Drawing.Imaging.ImageFormat.Png);
最后谢谢以上写博客的人,我们都是站在前人的基础上看的更高,更远。