Python Selenium使用onclick

时间:2017-07-27 20:46:21

标签: python selenium

我在python中使用selenium而无法找到并选择ok按钮。这是我试图使用的代码,但没有找到按钮。

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*=的建议,但似乎没有用。

2 个答案:

答案 0 :(得分:3)

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

来自Selenium文档:

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

答案 1 :(得分:0)

以下是您的问题的答案:

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

  1. 您可以考虑根据xpath构建name,如下所示:

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

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

    SubmitElem.click()
    
  4. 同样,在我看来,由于JavaScript和AJAX调用的存在,idname是动态的。在这种情况下,您可以考虑构建动态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()
    
  7.   

    总共 6 建议的定位器用于标识元素以及其他不同的选项。

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