1

I'm using driver.findElement(By.xpath("//a[@title='A K T İ V A S Y O N']")); to locate the element given below in the screenshots but getting Unable to find element error.

enter image description here enter image description here enter image description here enter image description here

There are nested classes and frames also. how can I use switch method for nested frames?

My last try is the following one; Screenshot's attached also.enter image description here

driver.findElement(By.xpath("//frameset[@id='fset1']//frame[@name='ax']//frame[@name='menu']//div[@id='vodaMenuDiv']//li[@id='CCBmain']//li[@id='ccbabone']//li[@id='ccbcquery']//a[@title='A K T İ V A S Y O N']")).click();

3
  • 2
    Check if the element is inside iframe
    – Alexey R.
    Apr 15, 2019 at 16:15
  • Try xpath using contains text- driver.findElement(By.xpath(".//a[contains(text(),'A K T İ V A S Y O N')]")); Apr 16, 2019 at 5:38
  • You can also try this may this work for you- driver.findElement(By.xpath(".//li[@id='ccbcquery']/a")); Apr 16, 2019 at 5:42

3 Answers 3

0

If you cannot find an element, you need to check if it is inside a frame (or iframe). A frameset is a way to split a window in multiple frames, which acts as a separate window. Selenium needs to switch to this frame first before you can find elements in it.

Your last image shows that the element is within multiple framesets and frames. As frames are not part of the page, but a sort of page on it own you first need to switch to the frame and then to frame within before you can find the element.

Check out some reads:

0

Use below alternatives to locate the element-

driver.findElement(By.xpath("//li[@id='ccbcquery']/a")).click();

equivalent css selector is

driver.findElement(By.cssSelector("li[id='ccbcquery']>a")).click();

OR

driver.findElement(By.cssSelector("li#ccbcquery>a")).click();

Pointed to be noted

  1. Make sure element is not in frame if yes then switch into respective frame using driver.switchTo().frame(frameid/element); and then perform action

  2. Use implicit/explicit wait to get element proper load and available in DOM

    driver.get("web_irl");
    driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
    

    Explicit Wait :

    new WebDriverWait(driver, 30).until(ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector("li#ccbcquery>a")))).click();
    
2
  • It is about frames (not iframes), voting down to push better answers up. Feel free to edit (and tag me in a comment to vote up again) or delete your answer. Apr 19, 2019 at 13:51
  • @NielsvanReijmersdal, thanks for suggestion, I have updated the answer
    – NarendraR
    Apr 29, 2019 at 14:57
0

By using: https://github.com/nick318/FindElementInFrames

You can write:

SearchByFramesFactory searchFactory = new SearchByFramesFactory(driver);
searchFactory.search(() -> driver.findElement(By.xpath("//a[@title='A K T İ V A S Y O N']"))).getElem();

It will find your element across any iframes.

2
  • I believe the good answer would not be just promoting your library but also give a quick guide on how to apply it to address OP's particular issue.
    – Alexey R.
    Oct 16, 2020 at 22:15
  • @AlexeyR updated, thank you
    – nick318
    Oct 17, 2020 at 15:08

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.