Reputation: 83
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>
Upvotes: 1
Views: 2418
Reputation: 6398
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.
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:
Upvotes: 1