【问题标题】:Unable to find Checkbox element with Selenium and Python无法使用 Selenium 和 Python 找到 Checkbox 元素
【发布时间】:2016-09-21 16:48:02
【问题描述】:

这是单独的 Checkbox 的 HTML 代码:

<table id="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True" border="0">
			<tbody><tr>
				<td><input id="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_0" type="checkbox" name="rmaAssetCosmeticComponents$ctl00$CheckBoxList_Comp_17_38788_24582_73_0_True$0"><label for="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_0">Cracked Case</label></td><td><input id="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_1" type="checkbox" name="rmaAssetCosmeticComponents$ctl00$CheckBoxList_Comp_17_38788_24582_73_0_True$1"><label for="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_1">Cracked Case (Upper Half)</label></td>
			</tr><tr>
				<td><input id="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_2" type="checkbox" name="rmaAssetCosmeticComponents$ctl00$CheckBoxList_Comp_17_38788_24582_73_0_True$2"><label for="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_2">Cracked Face Plate</label></td><td><input id="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_3" type="checkbox" name="rmaAssetCosmeticComponents$ctl00$CheckBoxList_Comp_17_38788_24582_73_0_True$3"><label for="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_3">Deep Scratches</label></td>
			</tr><tr>
				<td><input id="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_4" type="checkbox" name="rmaAssetCosmeticComponents$ctl00$CheckBoxList_Comp_17_38788_24582_73_0_True$4"><label for="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_4">Discolored Case</label></td><td><input id="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_5" type="checkbox" name="rmaAssetCosmeticComponents$ctl00$CheckBoxList_Comp_17_38788_24582_73_0_True$5"><label for="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_5">Light Scratches In Case</label></td>
			</tr><tr>
				<td><input id="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_6" type="checkbox" name="rmaAssetCosmeticComponents$ctl00$CheckBoxList_Comp_17_38788_24582_73_0_True$6"><label for="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_6">Major Cracks</label></td><td><input id="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_7" type="checkbox" name="rmaAssetCosmeticComponents$ctl00$CheckBoxList_Comp_17_38788_24582_73_0_True$7"><label for="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_7">Major Scratches</label></td>
			</tr><tr>
				<td><input id="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_8" type="checkbox" name="rmaAssetCosmeticComponents$ctl00$CheckBoxList_Comp_17_38788_24582_73_0_True$8"><label for="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_8">Minor Cracks</label></td><td><input id="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_9" type="checkbox" name="rmaAssetCosmeticComponents$ctl00$CheckBoxList_Comp_17_38788_24582_73_0_True$9"><label for="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_9">Minor Scratches</label></td>
			</tr><tr>
				<td><input id="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_10" type="checkbox" name="rmaAssetCosmeticComponents$ctl00$CheckBoxList_Comp_17_38788_24582_73_0_True$10"><label for="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_10">Missing Port Cover</label></td><td><input id="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_11" type="checkbox" name="rmaAssetCosmeticComponents$ctl00$CheckBoxList_Comp_17_38788_24582_73_0_True$11"><label for="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_11">Missing Side Panel</label></td>
			</tr><tr>
				<td><input id="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_12" type="checkbox" name="rmaAssetCosmeticComponents$ctl00$CheckBoxList_Comp_17_38788_24582_73_0_True$12"><label for="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_12">No Back Cover</label></td><td><input id="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_13" type="checkbox" name="rmaAssetCosmeticComponents$ctl00$CheckBoxList_Comp_17_38788_24582_73_0_True$13"><label for="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_13">No Bay Cover</label></td>
			</tr><tr>
				<td><input id="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_14" type="checkbox" name="rmaAssetCosmeticComponents$ctl00$CheckBoxList_Comp_17_38788_24582_73_0_True$14"><label for="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_14">No Face Plate</label></td><td><input id="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_15" type="checkbox" name="rmaAssetCosmeticComponents$ctl00$CheckBoxList_Comp_17_38788_24582_73_0_True$15"><label for="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_15">Open Box</label></td>
			</tr><tr>
				<td><input id="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_16" type="checkbox" name="rmaAssetCosmeticComponents$ctl00$CheckBoxList_Comp_17_38788_24582_73_0_True$16"><label for="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_16">Open Box, Sealed Unit</label></td><td><input id="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_17" type="checkbox" name="rmaAssetCosmeticComponents$ctl00$CheckBoxList_Comp_17_38788_24582_73_0_True$17"><label for="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_17">Scratches In Screen</label></td>
			</tr><tr>
				<td><input id="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_18" type="checkbox" name="rmaAssetCosmeticComponents$ctl00$CheckBoxList_Comp_17_38788_24582_73_0_True$18"><label for="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38788_24582_73_0_True_18">Sealed Box</label></td><td></td>
			</tr>
		</tbody></table>

大家好!问题既简单又复杂,在图片中是我要单击的目标,一个复选框,无论如何都应该很容易定位,但由于某种原因 Python 不断向我抛出这个错误(我之前遇到过,但现在我无法绕过):

Traceback (most recent call last):
  File "C:\Users\AMSUser\AppData\Local\Programs\Python\Python35-32\Scripts\Add Asset.py", line 167, in <module>
    nobackcover = browser.find_element_by_xpath('//*[@id="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38774_24566_73_0_True_12"]')
  File "C:\Users\AMSUser\AppData\Local\Programs\Python\Python35-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 293, in find_element_by_xpath
    return self.find_element(by=By.XPATH, value=xpath)
  File "C:\Users\AMSUser\AppData\Local\Programs\Python\Python35-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 752, in find_element
    'value': value})['value']
  File "C:\Users\AMSUser\AppData\Local\Programs\Python\Python35-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 236, in execute
    self.error_handler.check_response(response)
  File "C:\Users\AMSUser\AppData\Local\Programs\Python\Python35-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 192, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38774_24566_73_0_True_12"]"}
  (Session info: chrome=52.0.2743.116)
  (Driver info: chromedriver=2.23.409699 (49b0fa931cda1caad0ae15b7d1b68004acd05129),platform=Windows NT 10.0.14393 x86_64)

如果我使用名称或 ID 来定位复选框,则为变体。

当我使用 Chrome 开发人员检查元素后复制 xpath 工具这是我得到的:

"//*[@id="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38760_24576_73_0_True_12"]".

这是我目前使用的代码:

#Here i open the checkbox menu that gives me the checkbox i need to click
Cosmeticselect = browser.find_element_by_xpath('//*[@id="rmaAssetCosmeticComponents_ctl00_btnAdd"]')
Cosmeticselect.click()
#2 seconds delay because it takes a second to load.
time.sleep(2)
#I have tried several iterations of this none give me the desire output, maybe this checkbox is in another iframe? if so i have yet to find it in the code.
nobackcover = browser.find_element_by_id('rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38776_24568_73_0_True_12')
#nobackcover = browser.find_element_by_xpath('//*[@id="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38775_24567_73_0_True"]/tbody/tr[7]/td[1]/label')
#nobackcover = browser.find_element_by_name('rmaAssetCosmeticComponents$ctl00$CheckBoxList_Comp_17_38778_24570_73_0_True$12')
nobackcover.click()

我怀疑我必须切换到化妆品“窗口”,但我还没有找到对 iframe 或类似内容的引用,我会继续努力,当我找到解决方案时,我会发布它,但如果有人有兴趣为这个问题添加一双新的眼睛,我将不胜感激。

【问题讨论】:

  • 无意冒犯,但是在查看屏幕截图和代码后,我的眼睛不再“新鲜”了:) 请在问题中只留下代码的相关部分。另外,如果您在开发人员工具中右键单击元素并复制 xpath 会怎样——您会得到什么?谢谢。
  • 另外让我们知道,元素id属性值在这里是动态变化的还是固定的??
  • 更新了问题。 Surabh Gaur 我认为这个元素是固定的,但我不确定当我确定更新问题时。
  • 你能分享相关的HTML代码吗?请确保我已修复或不只是多次刷新页面并查看 id 是否正在更改??
  • 看到整个 html 输入会很有趣。我相信你可以在属性中找到一些不同的字符串,你可以使用。

标签: python-3.x selenium


【解决方案1】:

在您使用 html 代码更新之前,您可以尝试以下方法:

css
input[id*='rmaAssetCosmeticComponents'][id*='True_12']

xpath 的
//input[text()='No Back Cover']
//input[contains(@id, 'rmaAssetCosmeticComponents')][contains(@id, 'True_12')]

跳到 id 的最后一部分不变,你可以根据 ht 属性不变的部分创建选择器,或者根据元素中包含的文本。

【讨论】:

  • 更新问题。
  • 好像id的中间部分可能会改变,相应更新了答案。
  • 是的!有用!非常感谢劳达,我发誓这是一个静态 ID,感谢您纠正我!最后,我的脚本完成了!
【解决方案2】:

首先,确保您的路径 (//[@id="rmaAssetCosmeticComponents_ctl00_CheckBoxList_Comp_17_38774_24566_73_0_True_12") 可以使用 Selenium IDE 指向正确的元素

其次,使用WebElement等到元素可点击或存在的元素定位

【讨论】:

  • 如何使用 WebElement 等待可点击元素?因为直到现在我一直在使用“硬睡眠”来等待 1 或 3 秒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 2023-03-07
  • 1970-01-01
  • 2022-09-30
相关资源
最近更新 更多