简体   繁体   中英

org.openqa.selenium.NoSuchElementException: Unable to locate element:

I'm unable to click a button and an exception is thrown as unable to locate element and exception throws on the marked lines of the screenshot.

The button takes some time to load and I have increased the time to 100 seconds, yet that didn't fix the error.

Code:

public static WebElement viewShipment(WebDriver driver, String mskuType) {
    WebElement noOfShipment = driver.findElement(By.xpath(".//*[@id='fba-core-workflow-shipment-summary-shipment']"));
    WebDriverWait wait = new WebDriverWait(driver, 15);
    List<WebElement> shipmentList = noOfShipment.findElements(By.tagName("tr"));
    int shipmentCount = shipmentList.size();

    for (int row=1;row<shipmentCount;row=+1)
    {
        WebElement onOfSkuWE= driver.findElement(By.xpath(".//*[@id='fba-core-workflow-shipment-summary-shipment']/tr["+row+"]/td[3]"));
        String noOfSku = onOfSkuWE.getText();
        int noOfSkuValue = Integer.parseInt(noOfSku);
        for(int i=0;i<2;i++)
        {
            try{
                if(mskuType.equalsIgnoreCase("single"))
                {
                    if(noOfSku.equalsIgnoreCase("1"))
                    {
                        Thread.sleep(10000);
                        WebElement workOnShipmentWE = driver.findElement(By.xpath(".//*[@id='fba-core-workflow-shipment-summary-shipment']/tr["+row+"]/td[6]/button"));
                        wait.until(ExpectedConditions.visibilityOf(workOnShipmentWE));
                        workOnShipmentWE.click();
                        break;
                    }
                }
                else if(mskuType.equalsIgnoreCase("multiple"))
                {
                    if(noOfSkuValue>1)
                    {
                        WebElement moreThanOneUnit = driver.findElement(By.xpath(".//*[@id='fba-core-workflow-shipment-summary-shipment']/tr["+row+"]/td[6]/button"));
                        wait.until(ExpectedConditions.elementToBeClickable(moreThanOneUnit));
                        moreThanOneUnit.click();
                        break;
                    }
                }
            }
            catch(Exception e)
            {
                driver.navigate().refresh();

                e.getMessage();
            }
        }
    }
    return element;
}   

HTML:

<tbody id="fba-core-workflow-shipment-summary-shipment">
    <tr>
        <td>FBA (11/3/16 9:32 PM) - 1</td>
        <td>FBA43K62MB</td>
        <td class="number total-line-items">1</td>
        <td class="number total-quantity">3</td>
        <td>
        <td>
            <button class="amznBtn btn-lg-pri-arrowr" onclick="window.location='#FBA43K62MB/prepare'" style="width: 28ex;" type="button" name="Work on shipment">
                <span>Work on shipment</span>
            </button>
            <p class="action-links content-bottom">
            <p class="action-links">
            <p/>
        </td>
    </tr>
    <tr style="display: none;">
    <tr>
    <tr style="display: none;">
    <tr>
    <tr style="display: none;">
</tbody>

1.If the page is loading too slow , then try out with the following ExpectedCondition:

 WebElement myDynamicElement = (new WebDriverWait(driver, **10**)).until(**ExpectedConditions.presenceOfElementLocated**(By.id("fba-core-workflow-shipment-summary-shipment")));

Keep the code as the first statement of the viewShipment method. This will make sure that web driver waits for the element (specified by Id, in this case) to load for the configured time (10 seconds in the code). Increase this value if page loading is too slow , as per your requirements.

The advantage of using ExpectedCondition over Thread.sleep is that, whenever an element is found, it will be returned immediately (no need to wait to complete 10 seconds, such as the case in case of Thread.sleep).

This waits up to 10 seconds before throwing a TimeoutException or if it finds the element will return it in 0 - 10 seconds. WebDriverWait by default calls the ExpectedCondition every 500 milliseconds until it returns successfully. A successful return value for the ExpectedCondition function type is a Boolean value of true, or a non-null object.

  1. If the element to found is, part of an iframe or new window: If the element is inside a frame (check whether the elements you are trying to find, are child elements of an iframe tag), then first find the frame and then switch to it. then use the XPath to find elements.

If the element is in a new window (like opened in new tab when you click a link), then first find the window and then switch to it, and then try to find the element.

References:

  1. http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp
  2. https://seleniumhq.github.io/selenium/docs/api/dotnet/html/T_OpenQA_Selenium_Support_UI_ExpectedConditions.htm
  3. https://stackoverflow.com/a/10887059/2575259
  4. https://stackoverflow.com/a/9597714/2575259

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM