2017-01-19 3 views
0

Так что я очень новый и пытаюсь найти что-то для использования в python.Такая же команда работает один раз, когда выполняется, но выдает исключение, когда выполняется второй раз?

Элемент:

<div id="scroll2" class="fm2 p8 cur m_bt2" onclick="javascript:displayResultsLogin('scroll2')"> Show More Results </div> 

Xpath: //*[@id="scroll2"]

я выполнить, используя оболочку:

wait = WebDriverWait(driver, 10) 
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//*[contains(text(), ' Show More Results')]"))) 
element.click() 

После того, как выше было выполнено, элемент:

<div id="scroll3" class="fm2 p8 cur m_bt2" onclick="javascript:displayResultsLogin('scroll3')"> Show More Results </div> 

XPath: //*[@id="scroll3"]

Когда я снова выполнить ту же команду, он бросает исключение:

wait = WebDriverWait(driver, 10) 
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//*[contains(text(), ' Show More Results')]"))) 
element.click() 

Exception

Traceback (самый последний вызов последнего): файла "", линия 1 , в element = wait.until (EC.element_to_be_clickable ((By.XPATH, "// * [содержит (текст(), 'Показать другие результаты')]"))) Файл "C: \ Python34 \ lib \ site-packages \ selenium \ webdriver \ support \ wait.py ", строка 80, до повышение TimeoutException (сообщение, экран, StackTrace) selenium.common.exceptions.TimeoutException: Сообщение:

Невозможно понять, почему. Или путь вокруг него.

+0

Показать полное исключение – Andersson

+0

@Andersson обновляется соревнуются журнал исключений. Дело в том, что я вижу элемент, отображаемый и готовый для клика. – Sid

+0

Действительно ли это видно на странице или вам нужно прокрутить вниз, чтобы увидеть эту кнопку? – Andersson

ответ

3

Я твердо убежден, что это связано с тем, как приложение вы тестируете построен: Похоже, нажав scroll2 кнопку сделает что один невидимый и добавить кнопку scroll3 на страницу.

После этого, когда вы звоните wait.until (...), что происходит в том, что WebDriver находится кнопка scroll2 (так как выражение XPath, что только проверяет внутренний текст будет по-прежнему соответствовать его), а затем будет ожидать, что он станет доступен для кликабеля, чего никогда не будет, потому что он больше не виден.

Вы можете воссоздать, что с помощью простого веб-страницы, как это:

<html> 
    <head>  
     <script> 
      document.onreadystatechange = function() { 
       var element = document.getElementById("1"); 

       element.addEventListener("click", function() { 
        this.style.display = "none"; 

        document.getElementById("2").style = ""; 
       }); 
      } 
     </script> 
    </head> 
    <body> 
     <div id="1">Show More Results</div> 
     <div id="2" style="display:none">Show More Results</div> 
    </body> 
</html> 

И этот питон сниппета:

wait = WebDriverWait(driver, 10) 
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//*[contains(text(), 'Show More Results')]"))) 
element.click() 

wait = WebDriverWait(driver, 10) 
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//*[contains(text(), 'Show More Results')]"))) 
element.click() 

Здесь также второй wait.until (...) воли даже если страница визуально выглядит правильно.

По существу есть два решения этой:

  • Изменение HTML, так что, как только кнопка scroll3 добавляется кнопка scroll2 фактически получает удаляется из DOM, или
  • изменить тест, так что он найдет кнопку, на которую он хочет нажать более стабильным способом. Например, для примера, упомянутого выше, вы можете добавить стиль отображения в локатор XPath, чтобы убедиться, что он отображает только отображаемые элементы.

Пример:

wait = WebDriverWait(driver, 10) 
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//*[contains(text(), 'Show More Results') and not(contains(@style, 'display: none'))]"))) 
element.click() 

wait = WebDriverWait(driver, 10) 
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//*[contains(text(), 'Show More Results') and not(contains(@style, 'display: none'))]"))) 
element.click() 

Обратите внимание, что вы, возможно, придется включить видимость предка, а также в вашем локатора, подробнее см этот вопрос: войти How do I select only visible elements using XPath?

+0

Спасибо @ ralph.mayr, это немного пошло сейчас голова. Просто начал учиться. Я определенно постараюсь понять это больше. Тем временем я удалил 'wait.until' и использовал оператор if, похоже, он работает немного лучше. Попал в новую проблему, связанную с формой, отображаемой каждые 2-3 щелчка. Попытка опубликовать об этом, но не может отправлять сообщения в течение 90 минут. – Sid

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