简体   繁体   中英

Clicking on Image Link with Selenium webdriver java

I have looked at the answers to similar questions and it seems like the code that I have should work but I get "Cannot click on element" error when the code invokes click on the web element.

Following is html markup segment

<div class="x-tree-node-item">
  <a title="Manage Users" class="sidenavmenu_unselected" id="m-22" onclick="toggleMenu('22', '');" href="#">
    <img title="" align="bottom" id="mi-22" alt="" src="ca/images/arrow.png" border="0">Manage Users
  </a>
  <div style="margin-left: 1em;">
    <ul class="submenu-show" id="mp-22" style="height: auto; display: none;">
      <li>
        ...
      </li>
    </ul>
  </div>

Java code to locate the link is:

By xpath=By.xpath("//a[contains(@title,'Manage Users')]/img");
WebElement manageUsers = (new WebDriverWait(driver, 10))
  .until(ExpectedConditions.presenceOfElementLocated(xpath));
manageUsers.click();

It finds the element but I get error: org.openqa.selenium.ElementNotInteractableException: Cannot click on element

The ids are generated dynamically so we can't find by id and image source is used by multiple links. Thank you for your help.

* Update * The problem was solved with help from JeffC and Xwris. JeffC's last comment showed that there are multiple nodes being found. So, I added following code:

       List<WebElement> manageUserImages=driver.findElements(xpath);
   for (WebElement manageUserImage:manageUserImages) {
       if (manageUserImage.isDisplayed()) {
           manageUserImage.click();   
       }
   }

Since there is only element displayed at one time with "Manage Users" as title, this finds the correct elements and delivers the desired results.

@JeffC, if you can post an answer with your comment, we can mark that answer as the correct answer. Thanks again to everyone who helped.

It looks your xpath is wrong. Personally I would start from the div and the drill down to the actual < a > tag.

In some cases where your web-element sits under a < li > tag, I would go even further up the tree and select a div which is not hidden.

ie you instruct it to search for under the specific < div >

Who told you you can select only by id? You can use anything! :)

This should work.

//div[@class='x-tree-node-item']//a[@title='Manage Users']

This should work as well. Correct usage of ' contains ' is as follows:

//div[@class='x-tree-node-item']//a[text()[contains(.,'Manage Users')]]

Hope this helps!

PS. notice that text contains is case-sensitive and will match partial text. So if you searched for:

//a[text()[contains(.,'age User')]]

it will still be a successful match!

Update after OP's comments:

You don't actually need xpath helper. You just hit F12 in your browser and then CTRL+f so you open a search field at the bottom. Please see my example on how I locate the title of your question with partial text match ('Image').

Also notice next to xpath where it says 1 of 1 (meaning that our element is unique). Try to do the same for your case. I suspect that you need to go higher up the tree and start from an earlier < div > so you can locate the rest. 在此处输入图片说明

Leave off the "/img" part of your locator. You want to click the anchor (a) not the image itself.

  By xpath=By.xpath("//a[contains(@title,'Manage Users')]");
   WebElement manageUsers = (new WebDriverWait(driver, 10))
           .until(ExpectedConditions.presenceOfElementLocated(xpath));
   manageUsers.click();

Alternatively, the locator could be: //a[@id='m-22']

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