MrGlass
MrGlass

Reputation: 83

How do I interact with a dynamic id through python selenium?

I am trying to click on an icon in a web page. This is the element I am attempting to click:

<a class="Button ButtonIcon IconOnly DataSelector NormalState" 
id="ze6402ef81ea54445aec5dab8790c781f" tabindex="0"><span class="Icon"></span>
<span class="Text"></span></a>

I have no problem interacting with the code below:

browser.find_element_by_css_selector('ze6402ef81ea54445aec5dab8790c781f').click()

The problem is that the id is dynamic with each session. I have attempted a workaround with the following code with no success:

browser.find_element_by_xpath("//a[span/@class='Text']").click()

and

browser.find_element_by_xpath("//a[span/@class='Icon']").click()

Afterwards, I noticed that the element needs to be in a hover state in order to be clicked. So next, I used ActionChains to try to simulate a hover state -- again, with no success:

actions=ActionChains(browser)
element=browser.find_element_by_css_selector("//a[span/@class='Icon']")
actions.move_to_element(element).click().perform()

Then, I tried to TAB to the element via send_keys and ActionChains -- but it ended up cycling rapidly through page, instead of one element at a time:

actions.send_keys(Keys.TAB)

I wanted to put in my due diligence before posting my issue. Any assistance is appreciated - Thank you.

Upvotes: 2

Views: 736

Answers (2)

undetected Selenium
undetected Selenium

Reputation: 193068

As you mentioned, you don't have a problem with the following line of code:

browser.find_element_by_css_selector('ze6402ef81ea54445aec5dab8790c781f').click()

But the only issue here is that the id is dynamic, so we can use the class attribute to construct an unique cssSelector or an unique xpath as follows:

  • cssSelector :

    driver.findElement(By.cssSelector("div.Button.ButtonIcon.IconOnly.DataSelector.NormalState"));
    
  • xpath :

    driver.findElement(By.xpath("//div[@class='Button ButtonIcon IconOnly DataSelector NormalState']"));
    

Upvotes: 1

JOberloh
JOberloh

Reputation: 1106

Use these XPaths:

//span[@class='Text']
//span[@class='Icon']

Yours were formatted incorrectly.

Upvotes: 0

Related Questions