【问题标题】:Python Selenium using onclickPython Selenium 使用 onclick
【发布时间】:2017-07-27 20:46:21
【问题描述】:

我在 python 中使用 selenium,无法找到并选择确定按钮。这是我尝试使用的代码,但找不到按钮。

SubmitElem = driver.find_element_by_name('ctl00$PlaceHolderMain$ctl01$RptControls$btnOK')

SubmitElem.submit()

这是网页代码

<input name="ctl00$PlaceHolderMain$ctl01$RptControls$btnOK" 
value="OK" 
onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ctl00$PlaceHolderMain$ctl01$RptControls$btnOK&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))"      
id="ctl00_PlaceHolderMain_ctl01_RptControls_btnOK" accesskey="o"   
class="ms-ButtonHeightWidth" type="submit">

关于我做错了什么有什么建议吗?我找到了一些添加 onclick*= 的建议,但它似乎不起作用。

【问题讨论】:

标签: python selenium


【解决方案1】:

如前所述,如果元素在 iframe 中,则需要 switch contexts。此外,如果元素需要时间才能显示在 DOM 上,因为它是由 JavaScript 动态呈现的,您可能需要waits。您基本上希望等到元素出现在页面上后再对其执行操作。

来自 Selenium 文档:

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "myDynamicElement"))
)

【讨论】:

    【解决方案2】:

    这是您问题的答案:

    根据您提供的 HTML,您可以考虑以下选项:

    1. 可以考虑在name的基础上构造一个xpath,如下:

      SubmitElem = driver.find_element_by_xpath("//input[@name='ctl00$PlaceHolderMain$ctl01$RptControls$btnOK']")
      SubmitElem.submit()
      
    2. 您也可以在id 的基础上尝试不同的xpath,如下所示:

      SubmitElem = driver.find_element_by_xpath("//input[@id='ctl00_PlaceHolderMain_ctl01_RptControls_btnOK']")
      SubmitElem.submit()
      
    3. 或者,您也可以考虑调用click() 方法而不是submit() 方法。

      SubmitElem.click()
      
    4. 在我看来,idname 是动态的,因为存在 JavaScript 和 AJAX 调用。在这种情况下,您可以考虑构造一个动态的xpath,如下所示:

      SubmitElem = driver.find_element_by_xpath("//input[starts-with(@id, 'ctl00')]")
      SubmitElem.submit()
      
    5. 可以考虑构造一个动态的css_selector如下:

      SubmitElem = driver.find_element_by_css_selector("input[id^='ctl00']")
      SubmitElem.submit()
      
    6. 最后,如果你看到NoSuchElementExceptionElementNotVisibleException你可以考虑诱导一些WebDriverWait如下:

      WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//input[starts-with(@name, 'ctl00')]")))
      driver.find_element_by_css_selector("input[name^='ctl00']").click()
      

    总共有 6 个建议的定位器来识别元素以及其他不同的选项。

    如果这能回答您的问题,请告诉我。

    【讨论】:

      猜你喜欢
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-08
      • 1970-01-01
      • 2022-11-01
      • 2021-11-26
      • 1970-01-01
      相关资源
      最近更新 更多