简体   繁体   English

在下拉菜单中选择动态元素,Selenium Python

[英]Selecting Dynamic Element in Drop Down Menu, Selenium Python

I am trying to select an input box in a drop down menu.我正在尝试 select 下拉菜单中的输入框。 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:以下是我寻求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:相对 xpath 变化:

//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:亲属 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.我曾尝试通过classcss selector select,但没有成功。 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!")

You can use one of it's attributes to find it.您可以使用其中一个属性来找到它。

XPATH: XPATH:

//input[@placeholder='Search in listbox']

The WebElement is an Angular element. WebElement是一个Angular元素。 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 :因此,理想情况下,单击您需要为element_to_be_clickable()引入WebDriverWait的元素,您可以使用以下任一定位器策略

  • Using XPATH :使用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:浏览器快照:

普罗佐罗

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM