我正在尝试使用Selenium创建显式等待,当无法访问页面时,等待Internet Explorer中“此页面无法显示”消息的可见性。当然,Selenium在xpaths中有撇号问题。我正在使用的代码如下......
String expectedText = "This page can't be displayed";
String waitforXpath = "//div[contains(.,'"+expectedText+"')]";
WebDriverWait wait = new WebDriverWait(driver,10);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(waitforXpath)));
但是,当然,Selenium会抛出一个TimeoutException,等待“此页面无法显示”元素的可见性。关于如何最好地解决这个问题的任何建议?
编辑:以下是该页面的来源......
<!DOCTYPE HTML>
<html>
<head>
<link rel="stylesheet" type="text/css" href="NewErrorPageTemplate.css" >
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>This page can't be displayed</title>
<script src="errorPageStrings.js" language="javascript" type="text/javascript">
</script>
<script src="httpErrorPagesScripts.js" language="javascript" type="text/javascript">
</script>
</head>
<body onLoad="javascript:getInfo();">
<div id="contentContainer" class ="mainContent">
<div id="mainTitle" class="title">This page can't be displayed</div>
<div class="taskSection" id="taskSection">
<ul id="cantDisplayTasks" class="tasks">
<li id="task1-1">Make sure the web address <span id="webpage" class="webpageURL"></span>is correct.</li>
<li id="task1-2">Look for the page with your search engine.</li>
<li id="task1-3">Refresh the page in a few minutes.</li>
</ul>
<ul id="notConnectedTasks" class="tasks" style="display:none">
<li id="task2-1">Check that all network cables are plugged in.</li>
<li id="task2-2">Verify that airplane mode is turned off.</li>
<li id="task2-3">Make sure your wireless switch is turned on.</li>
<li id="task2-4">See if you can connect to mobile broadband.</li>
<li id="task2-5">Restart your router.</li>
</ul>
</div>
<div><button id="diagnose" class="diagnoseButton" onclick="javascript:diagnoseConnectionAndRefresh(); return false;">Fix connection problems</button></div>
</div>
</body>
</html>
答案 0 :(得分:0)
您可以通过检查文字来大大简化您的问题:
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.textToBePresentInElementLocated(By.id("mainTitle"), "This page can't be displayed"));
答案 1 :(得分:0)
尝试使用循环逻辑。代码将在等待2秒后获得页面标题,并再次重试5次。
boolean isTitleFound= false;
int tryCount = 0;
while (!isTitleFound || (tryCount++)<5)
try{
Thread.sleep(2000)
} catch (Exception e) {
}
if (driver.getTitle().equalsIgnoreCase("This page can't be displayed") {
isTitleFound = true;
}
}
答案 2 :(得分:0)
每次将值传递给xpath查询时,都必须处理该值中的任何撇号。您尝试运行的实际xpath查询是;
//div[contains(.,'This page can't be displayed')]
你认为你能够逃避它,但是其他人和我在过去做这件事时遇到了问题。
http://www.seleniumtests.com/2010/08/xpath-and-single-quotes.html
使用concat为我和上面链接中的人工作。我希望以下xpath能够正常工作。
String expectedText = "concat('This page can','\"'\"','t be displayed')";
String waitforXpath = "//div[contains(.,'"+expectedText+"')]";
一般来说,我倾向于通过一种方法传递任何插入xpath的值,该方法会将其转换为xpath就绪的concat字符串。这是c#。
private string prepareForXpath(string text)
{
if (!text.Contains("'"))
{
return "'" + text + "'";
}
StringBuilder finalString = new StringBuilder();
finalString.Append("concat('");
finalString.Append(text.Replace("'", "',\"'\",'"));
finalString.Append("')");
return finalString.ToString();
}
这可能都非常混乱,这就是为什么xpath定位器可能会很痛苦的原因。我更喜欢SiKing建议的方法。方法不起作用的事实可能值得进一步研究。
答案 3 :(得分:0)
事实证明,Selenium实际上无法在IE&#34;上找到任何元素;此页面无法显示&#34;页面,但它可以在任何其他页面上。它还能够在Firefox和Chrome各自的“问题加载页面”中找到元素&#34;页面。但是,它可以在IE中获取页面的标题,该页面的标题等于我最初寻找的mainTitle
WebElement的文本。所以我采用了以下解决方案......
expectedText = "This page can't be displayed";
WebDriverWait wait = new WebDriverWait(driverRp,10);
wait.until(ExpectedConditions.titleContains(expectedText));
我已经改变了我的问题的标题,以反映我遇到的问题的实际根源,因为潜在的问题与我期望和最初提出的问题不同。这个IE / Selenium交互中非常奇怪的行为。我不知道为什么它无法在&#34上找到WebElements;此页面无法显示&#34;页。评论是否有人知道!