2015-06-22 6 views
0

Я пытаюсь создать явное ожидание с помощью Selenium, ожидающего видимости сообщения «Эта страница не может быть отображено» в Internet Explorer, когда страница не может быть достигнуто. Селен, конечно, имеет проблему с апострофом в xpaths. Код я работаю состоит в следующем ...Ожидание IE «Эта страница не может быть отображена» Страница

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))); 

Но, конечно же, Селен бросает TimeoutException ожидания на видимость «Эта страница не может быть отображена» элемент. Любые предложения относительно того, как наилучшим образом обойти это?

EDIT: Вот источник для этой страницы ...

<!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

Используйте другой XPath, CSS или что-нибудь еще ... все, что мы не можем вам помочь, не видя соответствующей части HTML. – SiKing

+0

@SiKing См. Мое редактирование – user2150250

+0

Пробовал ли вы использовать ID, 'By.Id (" mainTitle ")'? – Sham

ответ

0

Оказалось, что Selenium на самом деле не смог найти какие-либо элементы на странице IE «Эта страница не может быть отображена», но она может быть на любой другой странице. Он также мог находить элементы на страницах «Проблемы загрузки страниц» Firefox и Chrome. Тем не менее, он мог получить название страницы в IE, которое соответствует тексту используемого вами веб-элемента mainTitle, который я искал. Поэтому я прибег к следующему решению ...

expectedText = "This page can't be displayed"; 
WebDriverWait wait = new WebDriverWait(driverRp,10); 
wait.until(ExpectedConditions.titleContains(expectedText)); 

Я изменил название моего вопроса, чтобы отразить фактический корень проблемы у меня был, так как основная проблема отличается от того, что я ожидал, и первоначально - спросил он. Очень странное поведение в этом взаимодействии IE/Selenium. Я не знаю, почему он не может найти WebElements на странице «Эта страница не может быть отображена». Комментарий, если кто знает!

0

Вы можете значительно упростить вашу проблему путем проверки текста, как так:

WebDriverWait wait = new WebDriverWait(driver, 10); 
wait.until(ExpectedConditions.textToBePresentInElementLocated(By.id("mainTitle"), "This page can't be displayed")); 
+0

Кажется, что она не работает. Все еще не найдет элемент. – user2150250

+0

«Кажется, не работает». на самом деле не является явным. Прочитайте https://stackoverflow.com/help/mcve – SiKing

+0

Он по-прежнему выбрасывает TimeoutException ... 'org.openqa.selenium.TimeoutException: время ожидания после 10 секунд ожидания текста (« Эта страница не может быть отображена '), чтобы присутствовать в элементе, найденном By.id: mainTitle' – user2150250

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; 
    } 
} 
+0

Да, я думал об этом, но я действительно хотел попробовать и заставить его работать с классами WebDriverWait и ExpectedConditions, если это возможно потому что это то, за что они там, в конце концов. Это может быть единственным способом взломать его. – user2150250

0

Каждый раз, когда вы передаете значение в запрос xpath, вам придется обрабатывать любой апостроф в этом значении. Фактический запрос xpath, который вы пытаетесь запустить;

//div[contains(.,'This page can't be displayed')] 

Вы думаете, что сможете избежать этого, но другие, и у меня были проблемы с этим в прошлом.

http://www.seleniumtests.com/2010/08/xpath-and-single-quotes.html

Использование CONCAT работает для меня, и лицо в вышеуказанных link.I'd ожидают следующие 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. Тот факт, что подход не работает, вероятно, заслуживает большего изучения.

Смежные вопросы