Python 找不到要单击的元素-selenium

Python 找不到要单击的元素-selenium,python,selenium,Python,Selenium,我正在尝试在收到电子邮件后自动更新服务台票据。我已经找到了“倾听”电子邮件并启动网站/登录的方法,但是对于我来说,我认为最简单的部分之一就是最困难的部分。基本上,我需要单击下图中的下拉列表,然后键入或单击“确认”选项 带有下拉选项的服务台照片: 下面是下拉列表的代码片段,注意:代码中ID中的数字根据票证的不同而变化。在本例中,数字是298 <tr> <td id="td_298_status"> <div id="298_status" class="dropdow

我正在尝试在收到电子邮件后自动更新服务台票据。我已经找到了“倾听”电子邮件并启动网站/登录的方法,但是对于我来说,我认为最简单的部分之一就是最困难的部分。基本上,我需要单击下图中的下拉列表,然后键入或单击“确认”选项

带有下拉选项的服务台照片:

下面是下拉列表的代码片段,注意:代码中ID中的数字根据票证的不同而变化。在本例中,数字是298

<tr>
<td id="td_298_status">
<div id="298_status" class="dropdown-wrapper add-scroll autosuggest get-values-on-open hiddendropdown formField opened">
<select class="selectedKeysValues" style="display:none" id="status" name="status">
<option value="1" selected="">New</option>
</select>

<span class="dd-description"><a href="javascript:void(0)" onclick="openAdvancedSearchForComboBox('SelectFilterValues.jsp?func=updateComboBox&amp;fromComboBox=YES&amp;dbValueField=11587&amp;dbCaptionField=12868&amp;dbTable=20130&amp;comboboxId=status&amp;moduleRelevance=16');">Advanced Search</a></span>
<select class="custom_select" style="display:none" name="status_CustomSelect" id="status_CustomSelect">
</select><div class="newListSelected status_CustomSelect" tabindex="0"><input type="text" class="autoSuggestInput" value="" style="width: 156px;"><div class="selectedTxt"><span class="defaultText">New</span></div><div class="containerContentDiv" style="width: auto; top: 25px;"><div class="jScrollPaneContainer" style="display: block;"><div class="scroll_pane" id="addScroll_status_CustomSelect" style="display: block; height: 202px; top: 0px; overflow-x: hidden; overflow-y: auto;"><ul class="newList" style="left: 0px; display: block;"><li class="option_0_option">Please select a status</li><li class="option_1_option selected hiLite">New</li><li class="option_3_option">Closed</li><li class="option_4_option">Submit Error</li><li class="option_5_option">Pending</li><li class="option_7_option">Deleted</li><li class="option_11_option">Request Rejected</li><li class="option_37_option">Work In Progress</li><li class="option_38_option">Resolved</li><li class="option_39_option">Acknowledged</li></ul></div></div><div class="addedDescription" style="display: block;"><a href="javascript:void(0)" onclick="openAdvancedSearchForComboBox('SelectFilterValues.jsp?func=updateComboBox&amp;fromComboBox=YES&amp;dbValueField=11587&amp;dbCaptionField=12868&amp;dbTable=20130&amp;comboboxId=status&amp;moduleRelevance=16');">Advanced Search</a></div></div></div>
<span class="afterSelectJS" style="display:none">closureInformationCheck();StatusChange();</span>
</div>
</td>
<td id="closureInformationTD" style="display: none;"><table id="closureInformationTable"><tbody><tr><td class="Form_Ctrl_Label">Closure Information</td>
<td id="td_298_closureInformation" style="padding-left:25px;">
<div id="298_closureInformation" class="dropdown-wrapper add-scroll autosuggest get-values-on-open hiddendropdown formField">
<select class="selectedKeysValues" style="display:none" id="closureInformation" name="closureInformation">
<option value="0" selected="">None</option>
</select>

<span class="dd-description"><a href="javascript:void(0)" onclick="openAdvancedSearchForComboBox('SelectFilterValues.jsp?func=updateComboBox&amp;fromComboBox=YES&amp;dbValueField=11587&amp;dbCaptionField=12868&amp;dbTable=21229&amp;comboboxId=closureInformation');">Advanced Search</a></span>
<select class="custom_select" style="display:none" name="closureInformation_CustomSelect" id="closureInformation_CustomSelect">
</select><div class="newListSelected closureInformation_CustomSelect" tabindex="0"><input type="text" class="autoSuggestInput" value="" style="display: none;"><div class="selectedTxt"><span class="defaultText">None</span></div><div class="containerContentDiv"><div class="jScrollPaneContainer" style="display: none;"><div class="scroll_pane" id="addScroll_closureInformation_CustomSelect" style="height: 200px; overflow-y: auto; overflow-x: hidden; display: none;"><ul class="newList" style="left: 0px; display: none;"></ul></div></div><div class="addedDescription" style="display: none;"><a href="javascript:void(0)" onclick="openAdvancedSearchForComboBox('SelectFilterValues.jsp?func=updateComboBox&amp;fromComboBox=YES&amp;dbValueField=11587&amp;dbCaptionField=12868&amp;dbTable=21229&amp;comboboxId=closureInformation');">Advanced Search</a></div></div></div>
</div>
</td>
</tr></tbody></table></td></tr>


但我总是会收到错误,说明找不到元素。有什么想法吗?

您可能想与select元素交互。它们的工作方式不同于所有其他元素,并且有一个特定的Selenium库来处理它们。这里可能是完成你想做的事情最简单的方法。不过要注意,我不知道为什么在网页上找不到该元素——这是您首先要得到的答案。为此,如果页面呈现时默认不可见,我会确保它已滚动到视图中。您可能有超时问题等

from selenium.webdriver.support.select import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

timeout = 15
try:
    status_select = WebDriverWait(self.thread.driver, timeout).until(
        EC.visibility_of_element_located(("id", "status"))
    )
    Select(status_select).select_by_value("Acknowledged")
except:
    print("Element was not visible on page after", timeout, "seconds.")
根据您共享的HTML,您需要单击下图中的下拉列表,然后单击“确认”选项,您可以使用以下代码块:

driver.find_element_by_xpath("//div[@class='newListSelected status_CustomSelect']/input[@class='autoSuggestInput' and @type='text']").click()
driver.find_element_by_xpath("//div[@class='newListSelected status_CustomSelect']/input[@class='autoSuggestInput' and @type='text']//following::ul[@class='newList']/li[@class='option_39_option']").click()

从您的HTML代码中,我可以知道您想要操作的不是HTML的原生select use标记,实际上它是一个模拟的select,它的UI和行为看起来像原生select

要操作模拟选择,您需要执行以下步骤:

确定单击哪个元素将显示所有选项 找出所有选项的HTML代码,这样您就可以编写定位器来查找您想要选择的选项。 从您的HTML代码中,我无法确切地知道上面步骤1中所述元素的HTML代码。但是从截图上看,我想除了“请选择状态”之外的向下箭头应该是我们想要的


从您的HTML代码中,我可以找到所有选项的HTML代码,它们如下所示:

请选择一个状态 刚出现的 关闭 提交错误 悬而未决的 删除 请求被拒绝 正在进行的工作 断然的 承认
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

timeout = 15
try:
    status_select = WebDriverWait(self.thread.driver, timeout).until(
        EC.visibility_of_element_located(("id", "status"))
    )
    Select(status_select).select_by_value("Acknowledged")
except:
    print("Element was not visible on page after", timeout, "seconds.")
driver.find_element_by_xpath("//div[@class='newListSelected status_CustomSelect']/input[@class='autoSuggestInput' and @type='text']").click()
driver.find_element_by_xpath("//div[@class='newListSelected status_CustomSelect']/input[@class='autoSuggestInput' and @type='text']//following::ul[@class='newList']/li[@class='option_39_option']").click()