我已经能够在 java 中解决这个问题,但到目前为止我只能使用 jasmine js 打开网页。在java中,所有的 anchor 标签链接都可以保存在List中,然后每个链接都可以使用浏览器驱动对象进行导航。但是在 jasmine js 中,我无法将这些链接存储在数组中。这是我尝试做的事情:
describe('demo', function()
{
it('mydemo', function()
{
browser.ignoreSynchronization = true;
browser.driver.get('https://www.google.co.in');
var array = [];
array.push(browser.findElement(by.xpath("//a[@href]")));
for(var i=0; i<array.length; i++)
{
expect(browser.navigate().to(array[i]));
}
}
}
弹出一个新的浏览器窗口,导航到 google,然后关闭。似乎存在超时问题。使用 browser.ignoreSynchronization = true,服务器将其作为 Angular 应用程序忽略,但超时问题仍然存在。有什么建议吗?
最佳答案
要获取所有链接,请在 ElementArrayFinder
上调用 getAttribute
。它将返回一个 Promise
,一旦解决,它将为您提供所有链接。
然后调用 filter
排除动态链接 (href="javascript:...
) 并调用 forEach
迭代每个链接:
browser.ignoreSynchronization = true;
$$("a[href]").getAttribute("href")
.then(links => links
.filter(link => !/^javascript/.test(link))
.forEach(link => {
console.log(link);
browser.driver.get(link);
})
);
另一种更快的方法是通过一次调用浏览器来获取所有带有执行脚本的链接:
browser.ignoreSynchronization = true;
browser.driver.executeScript("return [].map.call(document.links, function(e){return e.href})")
.then(links => links
.filter(link => !/^javascript/.test(link))
.forEach(link => {
console.log(link);
browser.driver.get(link);
})
);
关于javascript - 使用 Protractor 测试页面上的所有链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40602793/