2

I am trying to select an input box in a drop down menu. The input box itself, however, appears to be dynamic. I've looked through similar posts, but they seem to be issue specific. I've had this problem a few times now with dynamic elements, and I'm hoping to understand a general approach to working with dynamic elements.

Here are the details of the element I seek to select:

<input class="lui-search__input ng-pristine ng-valid ng-empty ng-valid-maxlength ng-touched" maxlength="5000" q-placeholder="Object.Listbox.Search" ng-model="query" ng-disabled="disabled" autocomplete="" spellcheck="false" ng-trim="false" type="text" qva-blur="blurred()" qva-focus="autoFocus" qv-escape="escape($event)" qv-enter="enter($event)" placeholder="Search in listbox" aria-invalid="false" xpath="1">

(if this isn't helpful information, please let me know and I will update).

The relative xpath changes:

//body/div[8]/div[1]/div[1]/div[1]/ng-transclude[1]/div[1]/div[3]/div[1]/article[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/input[1]

in one instance

Another instance of the relative xpath:

//body/div[7]/div[1]/div[1]/div[1]/ng-transclude[1]/div[1]/div[3]/div[1]/article[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/input[1]

I have tried to select by class and css selector with no luck. I'd really like to understand how to approach this specific issue, and also a general idea of where in an element I should play around with for future instances of dynamic elements.

Thanks!

(If the element details I provided are not helpful, the element can also be accessed with the below code:)

driver.get("https://bi.prozorro.org/sense/app/fba3f2f2-cf55-40a0-a79f-b74f5ce947c2/sheet/NFTrm/state/analysis")

driver.find_element_by_xpath("//thead/tr[1]/th[2]").click()

#the input box I am attempting to select to no avail:
while True:
        try:
            WebDriverWait(driver, 25).until(EC.presence_of_element_located((By.XPATH, "//body/div[7]/div[1]/div[1]/div[1]/ng-transclude[1]/div[1]/div[3]/div[1]/article[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/input[1]")))
            break
        except TimeoutException:
            print("Loading took too much time!")
undetected Selenium
  • 183,867
  • 41
  • 278
  • 352
Yu Na
  • 112
  • 1
  • 18

2 Answers2

1

You can use one of it's attributes to find it.

XPATH:

//input[@placeholder='Search in listbox']
Arundeep Chohan
  • 9,779
  • 5
  • 15
  • 32
1

The WebElement is an Angular element. So ideally to click on the element you need to induce WebDriverWait for the element_to_be_clickable() and you can use either of the following Locator Strategies:

  • Using XPATH:

    driver.get('https://bi.prozorro.org/sense/app/fba3f2f2-cf55-40a0-a79f-b74f5ce947c2/sheet/NFTrm/state/analysis')
    WebDriverWait(driver, 60).until(EC.element_to_be_clickable((By.XPATH, "//th[@tid='st.header']//span[@title='Учасник']//following::th[@tid='st.header.search']"))).click()
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@placeholder='Search in listbox']"))).click()
    
  • Note: You have to add the following imports :

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
  • Browser Snapshot:

prozorro

undetected Selenium
  • 183,867
  • 41
  • 278
  • 352
  • Thank you for the reply! I receive a ```Timeout exception``` error upon running the second command. I put the command in a ```while True, try, except``` loop, except the element for the search box never seems to find the element – Yu Na Dec 07 '20 at 21:06
  • Ah! I got it to work with this xpath ```//input[@placeholder='Search in listbox']```. Not sure why this one worked instead of the one you provided though, do you know why? – Yu Na Dec 07 '20 at 21:23
  • @YuNa Targetting the _placeholder_ attribute seems to be a better option. Updated the answer. – undetected Selenium Dec 07 '20 at 21:41
  • Great, thanks! Do you know why that is the case? – Yu Na Dec 07 '20 at 21:54
  • 1
    @YuNa At this point I must admit automating PowerBI based web applications posses the toughest challenge. The code needs to be fine tuned optimally which would require some more R&D. – undetected Selenium Dec 07 '20 at 21:58