2017-07-27 180 views
0

我在使用python中的selenium,无法找到并选择ok按钮。这里是我试图使用的代码没有找到按钮。使用onclick的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*=,但它似乎没有工作。

+0

如果元素位于框架内部,则首先必须将上下文切换到该框架:请参见[Selenium无法定位元素(Python)WebScraping](https://stackoverflow.com/q/32636453/190597)。 – unutbu

回答

3

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

从硒文档:

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

这里是回答你的问题:

按照该HTML你提供,你可以考虑以下选项:

  1. 您可以考虑构建基于namexpath,如下所示:

    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() 
    

总共有推荐的定位器可以识别元素以及其他不同的选项。

让我知道这个答案是否是您的问题。