问题1 mac下Chrome浏览器无法最大化
解决方法:使用ChromeOptions类。ChromeOptions类是控制Chrome启动属性的类,主要可以提供一下功能:
- 设置 chrome 二进制文件位置 (binary_location)
- 添加启动参数 (add_argument)
- 添加扩展应用 (add_extension, add_encoded_extension)
- 添加实验性质的设置参数 (add_experimental_option)
- 设置调试器地址 (debugger_address)
//解决编码
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--start-fullscreen");
WebDriver driver = new ChromeDriver(chromeOptions);
问题2 显示等待(Explicit Waits)和隐式等待(implicit Waits)的区别
1、显示等待
1)显示等待定义了等待条件,只有满足条件才能执行后续的代码。
2)常见
Thread.sleep() //使用这种方法比较笨
WebDriverWait+ExpectedCondition //比较灵活,expected_condition模块提供了一组预定义的方法
//invisibilityOfElementLocated直到定位元素消失
new WebDriverWait(driver,10).until(ExpectedConditions.invisibilityOfElementLocated(By.id("whitebarrier")))
//until_not使用
new WebDriverWait(driver,10).until_not(ExpectedConditions.invisibilityOfElementLocated(By.id("whitebarrier")))
2、隐式等待
1)如果某些元素不是立即可用,隐式等待是告诉WebDriver等待一段时间在去查找元素。注意设置了隐式等待就是设置了WebDriver的整个生命周期。
driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
3、其他
1)页面加载超时时间
driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
driver.manage().timeouts().setScriptTimeout(60,TimeUnit.SECONDS);
问题3 需要多次下拉加载的更多数据的页面如何滑到到页面底部
思路:
1、需要知道关注用户的个数来得到需要下拉加载几次得到所有的数据。
2、使用for循环滑动页面(因为操作window.scrollTo语句,不会使页面自动加载下一页数据,必须重新执行一下window.scrollTo语句)
//获取当前登录用户的关注数
String number = driver.findElement(By.cssSelector("span[ms-text='@UserData.fans']")).getText();
//每页加载20条数据,关注数除20等到需要加载的页数
for (int i=0;i<Math.ceil(Double.parseDouble(number)/20.00);i++){
((JavascriptExecutor)driver).executeScript("window.scrollTo(0,10000);");
Thread.sleep(5000);
}
其他
1)String转double类型:Double.parseDouble(String str)
2)String转int类型:Integer.valueOf(String str).intValue()
3)向上取整Math.ceil(double)
4)向下取整Math.floor(double)
问题4 页面上多个滚动条选择滑动
一些废话,一个老大难的问题终于解决了,自己对JS这一块不太了解导致一个其实比较简单的问题今天才把原理弄明白,window.scrollTo()作用的是整个window,如果要对某个标签对执行JS脚本,必须先定位该元素。
//用Id定位
((JavascriptExecutor)driver).executeScript("var test = document.getElementById('catalogListBOX');"+
"test.scrollTo(0,50);");
var test = document.getElementById("id");
test.scrollTo(0,500);
//用ClassName定位,注意是Elements是有s的
((JavascriptExecutor)driver).executeScript("var test = document.getElementsByClassName('catalogListBOX')[0];"+
"test.scrollTo(0,50);");
附上html测试代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>滚动条</title>
</head>
<body>
<input type="button" onclick="scrollWindow()" value="滚动" />
<style>
ul{
overflow-y: scroll;
}
li{
list-style: none;
width: 100%;
height: 50px;
display: block;
background: pink;
border: 1px solid #3A3D40;
}
</style>
<div id = "catalogListBOX">
<ul class="catalogListBOX">
<li>1</li>
<li>1</li>
<li>1</li>
<li>1</li>
<li>1</li>
<li>1</li>
<li>1</li>
<li>1</li>
<li>1</li>
<li>1</li>
<li>1</li>
<li>1</li>
<li>1</li>
<li>1</li>
</ul>
</div>
<script type="text/javascript">
function scrollWindow()
{
var test = document.getElementsByClassName("catalogListBOX");
test.scrollTo(0,50);
console.log(test);
}
</script>
</body>
</html>