我在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("ctl00$PlaceHolderMain$ctl01$RptControls$btnOK", "", true, "", "", false, false))"
id="ctl00_PlaceHolderMain_ctl01_RptControls_btnOK" accesskey="o"
class="ms-ButtonHeightWidth" type="submit">
关于我做错的任何建议?我找到了一些添加onclick*=
的建议,但似乎没有用。
答案 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,您可以考虑以下选项:
您可以考虑根据xpath
构建name
,如下所示:
SubmitElem = driver.find_element_by_xpath("//input[@name='ctl00$PlaceHolderMain$ctl01$RptControls$btnOK']")
SubmitElem.submit()
您还可以根据xpath
尝试不同的id
,如下所示:
SubmitElem = driver.find_element_by_xpath("//input[@id='ctl00_PlaceHolderMain_ctl01_RptControls_btnOK']")
SubmitElem.submit()
或者,您也可以考虑使用click()
方法而不是submit()
方法。
SubmitElem.click()
同样,在我看来,由于JavaScript和AJAX调用的存在,id
和name
是动态的。在这种情况下,您可以考虑构建动态xpath
,如下所示:
SubmitElem = driver.find_element_by_xpath("//input[starts-with(@id, 'ctl00')]")
SubmitElem.submit()
您可以考虑按如下方式构建动态css_selector
:
SubmitElem = driver.find_element_by_css_selector("input[id^='ctl00']")
SubmitElem.submit()
最后,如果您看到NoSuchElementException
或ElementNotVisibleException
,可以考虑按以下方式引导某些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 建议的定位器用于标识元素以及其他不同的选项。
如果这回答你的问题,请告诉我。