2015-11-16 2 views
0

У меня возникают проблемы с автоматизацией тестов на внутреннем веб-сайте. В некоторых случаях всплывающее окно заморозит тест, пока я не закрою всплывающее окно вручную. После всплывания всплывающее окно не запускается, даже System.out.println.Popup freezes Selenium Webdriver до тех пор, пока всплывающее окно не будет закрыто вручную

driver.findElement(By.id("top_toolbarSALTkA7_Aras_Tbi_promote")).click(); 
System.out.println("test"); 

Я попробовал несколько способов обработки всплывающих окон, но нет кода вообще не запускается после щелчка(), и, кажется, это никогда не таймаут.

Пытались:

1.

((JavascriptExecutor) driver).executeScript("return document.getElementById('top_toolbarSALTkA7_Aras_Tbi_promote', 'onClick')"); 

2.

Set<String> windowHandles = driver.getWindowHandles(); 
    for(String handle : windowHandles) 
    { 
     driver.switchTo().window(handle); 
     if (driver.getTitle().contains(title)) 
     { 
      System.out.println("- (Page title is: " + driver.getTitle() + ")"); 
      break; 
     } 
    } 

3.

driver.switchTo().alert(); 

4.

Robot robot = new Robot(); 
robot.keyPress(KeyEvent.VK_ENTER); 
robot.keyRelease(KeyEvent.VK_ENTER); 

Если я закрою всплывающее окно, тест будет продолжен с System.out.println, а затем продолжен до финиша.

Я использую Selenium Webdriver 2.48.2 с FireFox 31.0, программирование - это Java. Любые идеи, что можно сделать? (Невозможно изменить сайт)

+0

Какие крепления для webdriver вы используете? когда я использую webdriverJS, и я хочу добавить javascript в браузер, я использую 'executeAsycScript()' вместо 'executeScript()' - он принимает обратный вызов, который вы вызываете, чтобы явно указать webdriver - клиентская сторона JS завершена - теперь продолжайте прогоняя остальные тесты –

+0

Извините, я забыл упомянуть! Я использую java – Louise

+0

Пробовал использовать это вместо executeScript() теперь, без изменений: '((JavascriptExecutor) драйвер) .executeAsyncScript (" return document.getElementById ('top_toolbarSALTkA7_Aras_Tbi_promote', 'onClick') ");' – Louise

ответ

1

Наконец-то нашли решение !!! Найденный в официальной пользовательской группе Selenium: https://groups.google.com/forum/#!searchin/selenium-users/popup%7Csort:relevance/selenium-users/eDqPiYoJ9-Q/kRI67cCVe5wJ

Решение должно начать новый поток, который ждет пару секунд, а затем нажимает ввод (или в моем случае первые вкладки на кнопку «ОК»). Просто вызовите функцию до всплывания.

public static final void prepareToPressEnterKey(int seconds, int tabs) { 
    ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1); 
    ScheduledFuture scheduledFuture = scheduledExecutorService.schedule(new Runnable() { 

     public void run() { 

      try { 
       Robot robot = new Robot(); 

       for (int i=0; i<tabs; i++) 
       { 
        robot.keyPress(KeyEvent.VK_TAB); 
        TimeUnit.SECONDS.sleep(1); 
        robot.keyRelease(KeyEvent.VK_TAB); 
       } 

       robot.keyPress(KeyEvent.VK_ENTER); 
       TimeUnit.SECONDS.sleep(1); //press for 1 sec 
       robot.keyRelease(KeyEvent.VK_ENTER); 
      } catch (AWTException | InterruptedException e) { 
       System.out.println("Prepare to Press Enter Exception"); 
      } 
     } 
    }, 
      seconds, 
      TimeUnit.SECONDS); 
    scheduledExecutorService.shutdown(); 
} 

Тем не менее, если есть какие-либо лучшие решения, которые я очень хотел бы знать. Благодаря!