3

Я пытаюсь щелкнуть по динамически загруженному элементу из веб-приложения React.js. Элемент открывает модальное окно с именем класса newItemView. Я пробовал немало вещей, но ничего надежного. Он будет работать несколько раз, но затем дайте мне ошибку.Ненадежный элемент click Selenium WebdriverJS

Целью является щелчок по динамическому элементу, а затем нажмите кнопку в модальном окне.

Попытка 1:

driver.wait(until.elementLocated(By.xpath(PATH_TO_DYNAMIC_ELEMENT)), MAX_WAIT_TIME, 
     'Could not locate the element within the time specified') 
     .then(function() { 
      driver.findElement(By.xpath(PATH_TO_DYNAMIC_ELEMENT)).click(); 
     }); 

driver.wait(until.elementLocated(By.xpath(PATH_TO_MODAL_BUTTON)), MAX_WAIT_TIME, 
     'Could not locate the modal element within the time specified') 
     .then(function() { 
      driver.findElement(By.xpath(PATH_TO_MODAL_BUTTON)).click(); 
     }); 

Примерно раз из 5 Trys, это бросает 'Could not locate the modal element within the time specified', потому что модальный фактически не открыт.

Покушение 2 ждет, а затем использует Actions подвинуться кнопку и нажмите:

driver.wait(until.elementLocated(By.xpath(PATH_TO_DYNAMIC_ELEMENT)), MAX_WAIT_TIME, 
     'Could not locate the dynamic element within the time specified') 
     .then(function() { 
      driver.findElement(By.xpath(PATH_TO_DYNAMIC_ELEMENT)) 
       .then(function(PATH_TO_DYNAMIC_ELEMENT_BUTTON) { 
        var actions = new webdriver.ActionSequence(driver); 
        actions.mouseMove(PATH_TO_DYNAMIC_ELEMENT_BUTTON).click().perform(); 
       }); 
     }); 

Затем выполняет проверку, чтобы увидеть, если модальный открыт

driver.findElement(webdriver.By.className("newItemView")) 
     .then(function() { 
     driver.findElement(By.xpath(PATH_TO_MODAL_BUTTON)).click(); 
     }, function (err) { 
      if (err.name === "NoSuchElementError") 
       console.log("Element was missing!"); 
     }); 

Это, кажется, работает лучше, но все равно бросает около 1 раза в 10 раз. На веб-странице Actions, похоже, работает, потому что элемент отображается на hover, но его не нажимали.

ответ

0

Я думаю, вы можете попробовать с исполнителем JavaScript ... как

WebElement YourElement= driver.findElement(By.id("YourElement-ID")); 
JavascriptExecutor ExeCutor = (JavascriptExecutor)driver; 
ExeCutor.executeScript("arguments[0].click();", YourElement); 
0

Ваша первая проблема заключается в том, что вы не выстроив цепочку обещаний правильно. Это легче увидеть проблемы, если вы расплющить свои обещания:

return driver.wait(until.elementLocated(By.xpath(PATH_TO_DYNAMIC_ELEMENT)), MAX_WAIT_TIME, 
    'Could not locate the dynamic element within the time specified') 
    .then(function() { 
     return driver.findElement(By.xpath(PATH_TO_DYNAMIC_ELEMENT)); 
    }) 
    .then(function(button) { 
     var actions = new webdriver.ActionSequence(driver); 
     return actions.mouseMove(button).click().perform(); 
    }); 

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

+0

Также элемент elementLocated должен возвращать элемент, который устраняет вызов findElement в середине. – Jason