Элемент Не неразрешимая ошибка с Selenium и Java - PullRequest
0 голосов
/ 13 марта 2019
<input type="submit" value="Add New Date of Commencement of Contract Details for INDoS No. : 09HL9630" onclick="method.value='loadFrom3A'" xpath="1">

Это то, что проверяет элемент, и это то, что я пытался, но он не работает. Xpath не работает, так как он изменяется в форме цикла. Пожалуйста, помогите

public void addnew_date() {

    driver.findElement(By.cssSelector("input[type='submit']").click();
    driver.manage().timeouts().pageLoadTimeout(40,TimeUnit.SECONDS);
    driver.manage().timeouts().implicitlyWait(40,TimeUnit.SECONDS);
}

Ответы [ 3 ]

0 голосов
/ 13 марта 2019

Вам нужно вызвать WebDriverWait в сочетании с Ожидаемые условия как elementToBeClickable () , и вы можете использовать следующую Стратегию локатора :

  • xpath:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//input[starts-with(@value, 'Add New Date of Commencement of Contract Details') and contains(@onclick, 'loadFrom3A')]"))).click();
    
0 голосов
/ 13 марта 2019

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

  • убедитесь, что у вас есть единственный элемент с локатором input[type='submit'], могут быть некоторые другие входные теги с типом отправки, которые могут быть первыми и ненеразрешимый.Поэтому необходимо сделать его более конкретным, добавив некоторые окружающие элементы или атрибуты, например, //input[type='submit'][contains(@value,'Add New Date')]

  • , чтобы выполнить проверку текущего состояния элемента, например

    List<WebElement> button = driver.findElements(By.cssSelector("input[type='submit']");
    
    System.out.println(button.size()) // 1 means element present 0 means no element and other count mean number of element
    
    if(button.size()==1){ //  check element is present
         if(button.get(0).isDisplayed()){ // check element is visible
            System.out.println("element is present and displaying");
            button.get(0).submit();
         }else{
            System.out.println("element is present but not displaying");
          }
    else if (button.size()>1){
        System.out.println("there are multiple element with same locator");
    
    } else {
        System.out.println("element not present for the locator");
    }
    
  • Если элемент требует некоторого времени для взаимодействия, разумно используйте условия ожидания селена

    1. Пример ImplicitWait:

      System.setProperty("webdriver.chrome.driver",".\\drivers\\chromedriver.exe");
      WebDriver driver = new ChromeDriver(options);
      driver.get("website_URL");
      driver.manage().timeouts().implicitlyWait(40,TimeUnit.SECONDS);
      
    2. Пример ExplicitWait:

      WebElement button = driver.findElement(By.xpath("//input[type='submit'][contains(@value,'Add New Date')]"));
      WebDriverWait wait = new WebDriverWait(driver, 30);
      wait.until(ExpectedConditions.visibilityOf(button)).click();
      
  • Альтернативный вариант, вы можете попробовать использовать метод .submit(), так как элемент является типомотправить или можете использовать JavascriptExecuter для выполнения клика

     JavascriptExecutor js = (JavascriptExecutor)driver;                   
     js.executeScript("arguments[0].click();", button);
    
0 голосов
/ 13 марта 2019

Пожалуйста, используйте это ниже xpaths.

Xpath-х: 1. //input[@type='submit']
2. //input[contains(text(),'Add New Date of Commencement')]

public void addnew_date() {
    driver.findElement(By.xpath("//input[@type='submit']").click();
}

Implicitwait и Pageloadtimeout следует использовать в начале теста, сразу после создания объекта webdriver, то есть драйвера.

что-то вроде:

System.setProperty("webdriver.chrome.driver",".\\drivers\\chromedriver.exe");
    WebDriver   driver = new ChromeDriver(options);
    driver.get("https://www.google.com");
    driver.manage().timeouts().pageLoadTimeout(40,TimeUnit.SECONDS);
    driver.manage().timeouts().implicitlyWait(40,TimeUnit.SECONDS);
...