【问题标题】:Select DropDown value using Python Selenium使用 Python Selenium 选择下拉值
【发布时间】:2020-12-28 17:41:39
【问题描述】:

我正在尝试在 Python 中使用 Selenium 选择下拉值,但无法这样做。我从“复制选择器”得到的代码是这样的。

#mui-12848

完整的 HTML 是

<input aria-invalid="false" autocomplete="off" type="text" class="MuiInputBase-input MuiOutlinedInput-input MuiAutocomplete-input Reports-autocompleteInput-133 MuiAutocomplete-inputFocused MuiInputBase-inputAdornedEnd MuiOutlinedInput-inputAdornedEnd" aria-autocomplete="list" autocapitalize="none" spellcheck="false" value="Monthly" id="mui-12848" aria-activedescendant="mui-12848-option-1" aria-controls="mui-12848-popup">

我试过了

s1 = Select(browser.find_element_by_id("mui-12848"))
s1.select_by_visible_text('Quarterly')

这给出了以下错误 UnexpectedTagNameException:消息:Select 仅适用于元素,不适用于

我也试过

browser.find_element(By.XPATH("//*[@id='mui-12848'][2]")).click();

这给出了以下错误 TypeError: 'str' object is not callable

感谢任何帮助。

以下是截图

【问题讨论】:

  • 你的元素不是SELECT,而是INPUT
  • @Mayank 您需要提供列表的html!您显示的输入不是所需的元素!您可以提供网址或html,然后我们可以提供帮助。
  • @MosheSlavin 我已将 html 粘贴到问题中...您的意思是我需要提供任何其他 HTML 吗?
  • @Mayank 是的,列表应该在不同的元素中

标签: python selenium selenium-webdriver


【解决方案1】:

该 HTML 元素的 input 类型是 text,它不是 Select 或下拉菜单。 selenium 类支持Select

【讨论】:

    【解决方案2】:

    此错误消息...

    UnexpectedTagNameException: Message: Select only works on elements, not on
    

    ...暗示您尝试使用 Select() 类,该类仅适用于 &lt;select&gt; 元素,而所需元素是 &lt;input&gt; 元素。

    要点击&lt;input&gt; 元素,您可以使用以下任一Locator Strategies

    • 使用css_selector

      driver.find_element_by_css_selector("input[class*='MuiInputBase-input'][id^='mui'][value='Monthly']").click()
      
    • 使用xpath

      driver.find_element_by_xpath("//input[contains(@class, 'MuiInputBase-input') and starts-with(@id, 'mui')][@value='Monthly']").click()
      

    理想情况下,点击您需要为WebDriverWait 诱导element_to_be_clickable() 的元素,您可以使用以下任一Locator Strategies

    • 使用CSS_SELECTOR:

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[class*='MuiInputBase-input'][id^='mui'][value='Monthly']"))).click()
      
    • 使用XPATH

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[contains(@class, 'MuiInputBase-input') and starts-with(@id, 'mui')][@value='Monthly']"))).click()
      
    • 注意:您必须添加以下导入:

      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support import expected_conditions as EC
      

    【讨论】:

    • 您好,感谢您的回复。我尝试了您的“CSS_Selector”和“XPATH”两种方法。在他们两个中,我都收到了这个错误“TimeoutException:Message:”
    • 如果有帮助,我已经添加了截图
    【解决方案3】:

    语法不正确。 应该是driver.find_element(By.XPATH, "//*[@id='mui-12848']").click()

    此外,您不能在定位器中包含索引。您需要先使用find_elements,然后在其上使用索引:driver.find_elements(By.XPATH,"//*[@id='mui-12848']")[2].click()

    【讨论】:

    • 您好,感谢您的回复。我尝试了您的方法,但出现此错误“InvalidSelectorException:消息:无效选择器:由于以下错误,无法使用 xpath 表达式 ////*[@id='mui-12848'] 定位元素:SyntaxError:失败对 'Document' 执行 'evaluate':字符串 '////*[@id='mui-12848']' 不是有效的 XPath 表达式。”
    • 如果有帮助,我已经添加了截图
    • 应该只有两个反斜杠//。我已经在我的回答中做出了改变。此外,您的屏幕截图中的id 与我在代码 sn-p 中使用的不同,因此请确保也对其进行更新。
    • 还有,既然是input类型,直接试试:driver.find_element(By.XPATH, "//*[@id='mui-23895']").send_keys("Yearly")
    【解决方案4】:

    尝试使用expected_conditions。见下文。将browser = ..... 替换为您的代码。

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    browser = .....
    
    # ADD YOUR CODE TO GET TO THE PAGE WITH THE BUTTON
    
    to_click = WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.XPATH, "//*[@id='mui-12848'][2]")))
    
    to_click.click()
    

    【讨论】:

    • 您好,感谢您的回复。我尝试了您的方法,但出现错误“TimeoutException:消息:”
    • 如果有帮助,我已经添加了截图
    • @Mayank 我更新了答案以使用presence_of_element_located 而不是element_to_be_clickable。如果这不起作用,则需要更改 xpath。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 2014-04-26
    • 2011-12-13
    • 2022-07-21
    相关资源
    最近更新 更多