有问题的网页是一个 SPA,我可以将它描述为一个包含多个 div“板”的单个大 div,我们通过在父 div 上应用 webkit 转换来滚动查看。
不幸的是,一旦滚动太远,WebDriver 返回的元素将被“禁用”——WebElement 属性“Displayed”为 false,Text 属性为空白,我无法对元素执行任何点击/操作。但是,它当时在页面上可见并且功能完善。
在调查问题时,我创建了一个小型测试网页,看看在什么情况下会发生这种情况。
NB 请注意,我们在本网站中没有使用 IFrame,JSFiddle 只是为了演示功能。
<html><head>
<script type="text/javascript" src="jquery-1.8.3.js"></script>
<style type="text/css">
.board-nav {
font-size: 12px;
color: #1b1a1a;
margin-right: 10px;
vertical-align: middle;
}
.scroller{
-webkit-transition: -webkit-transform 0ms; transition: -webkit-transform 0ms;
-webkit-transform-origin: 0px 0px;
-webkit-transform: translate(0px, 0px) scale(1) translateZ(0px);
transition-property: transform;
transform-origin: 0px 0px 0px;
transform: translate(0px, 0px) scale(1) translateZ(0px);
height: 4000px;
}
</style>
<script type="text/javascript">
var boardPositions = [0, -878, -1748, -2598, -3468];
var $scroller = null;
function changeBoard(event) {
var newValue = 'translate(0px, ' + boardPositions[event.target.id] + 'px) scale(1) translateZ(0px)';
$('.scroller').css('-webkit-transform',newValue);
$('.scroller').css('transform', newValue);
}
$(document).ready( function(){
var $boards = $('.board-nav');
$boards.on('click', changeBoard);
});
</script>
</head><body>
<div>
<div class="board-nav" id="0">Info</div>
<div class="board-nav" id="1">Board1</div>
<div class="board-nav" id="2">Board2</div>
<div class="board-nav" id="3">Board3</div>
<div class="board-nav" id="4">Board4</div>
</div>
<div id="content" style="width:1612px; height:864px; position:absolute; left:58px; overflow:hidden">
<div class="scroller">
<ul class="vertical">
<li class="v" id="li0">
<div class="target"><span>Info</span></div>
</li>
<li class="v" id="li1">
<div class="target"><span>Board1</span></div>
</li>
<li class="v" id="li2">
<div class="target"><span>Board2</span></div>
</li>
<li class="v" id="li3">
<div class="target"><span>Board3</span></div>
</li>
<li class="v" id="li4">
<div class="target"><span>Board4</span></div>
</li>
</ul>
</div>
</div>
</body></html>
似乎只要父 div Y 位置小于 -2000 左右,所有子元素都会以这种方式“禁用”。在此之前(例如 -1900 左右),返回的元素包含所有有效信息。我可以从 Board 3 切换回 Board 2,然后再次正确返回所有元素。返回板 3 - 所有板“禁用”。所以这似乎是浏览器 WebDriver 的限制。
WebDriver C# 测试代码:
var driver = new FirefoxDriver();
driver.Manage().Window.Maximize();
driver.Navigate().GoToUrl("testpage.html");
var elements = driver.FindElements(By.ClassName("v"));
return elements[3].FindElement(By.TagName("span")).Text;
Firefox 处理得最好——它至少在放弃之前显示 Info/Board1/Board2。Chrome 不处理任何板,为所有板返回相同的 Displayed = false、空白文本。
所以我的问题是 - 有没有办法解决这个问题?我可以测试其他板上的文本是否正确,同时显示 Board1/Info,但无法与最后 2 个板交互。
回答:
刚刚通过向父 div“scroller”元素添加高度属性解决了我的问题 - 我的猜测是 WebDriver 无法确定父 div 的高度,因此假设超出某个位置它不再可见。
我已经用解决方案更新了上面的代码和 JSFiddle