我正在尝试将具有相同类名的 ID 存储在一个数组中。当我尝试使用纯 python/selenium 时,它会失败并且只有在我使用 javascript 代码时才有效。
这是我当前的代码
html_content = """
<html>
<body>
<style>
.col-x-z.ab.def {
border: 4px outset orange;
background-color: lightblue;
text-align: center;
height:200px; width:400px;
}
.portlet.box.blue {
border: 2px outset blue;
background-color: lightblue;
text-align: center;
}
</style>
<div class="col-x-z ab def" id="sortable_portlets">
<div class="col-x-z ab def" id="col_1" col="1">
<div id="353" class=" portlet box blue">x</div>
<div id="355" class=" portlet box blue">x</div>
<div class=" wqp"></div>
</div>
<div class="col-x-z ab def" id="col_2" col="2">
<div id="473" class=" portlet box blue">y</div>
<div id="475" class=" portlet box blue">y</div>
<div class=" wqp"></div>
</div>
</div>
</body>
<html>
"""
from selenium import webdriver
driver_path="/my/path/chromedriver.exe"
driver = webdriver.Chrome(driver_path)
driver.get("data:text/html;charset=utf-8,{html_content}".format(html_content=html_content))
ids_arr = driver.execute_script('var coll = document.getElementsByClassName(" portlet box blue"), ids = [], i = 0; while( coll[ i ] ) { ids.push( coll[ i++ ].id ) };return ids;')
>>> ids_arr
['353', '355', '473', '475']
如您所见,使用 javascript,我将 4 个 ID 存储在 ids_arr
中。
但是如果我这样尝试,我会得到错误:
>>> driver.find_element_by_class_name(" portlet box blue")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/myUser/.local/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 564, in find_element_by_class_name
return self.find_element(by=By.CLASS_NAME, value=name)
File "/home/myUser/.local/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 976, in find_element
return self.execute(Command.FIND_ELEMENT, {
File "/home/myUser/.local/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "/home/myUser/.local/lib/python3.8/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.InvalidSelectorException: Message: invalid selector: An invalid or illegal selector was specified
(Session info: chrome=90.0.4430.93)
出了什么问题以及如何在没有 javascript 的情况下使其工作?谢谢。
答案 0 :(得分:0)
问题在于您的代码是
document.getElementsByClassName(" portlet box blue")
它正在按类名搜索元素,但您为该方法提供了 3 个类名:“portlet”、“box”和“blue”。这就是您收到消息 invalid selector
的原因。您必须只选择一种方法才能成功……或者您可以使用 CSS 选择器 .portlet.box.blue
来获得所有三种。注意:CSS 选择器中的 .
表示类名。
我不知道你为什么要使用 JS...你不需要。
elements = driver.find_elements_by_css_selector(".portlet.box.blue")
for element in elements:
print(element.get_attribute("id"))
或者如果你想要数组中的元素 ID,你可以这样做
elements = driver.find_elements_by_css_selector(".portlet.box.blue")
ids = []
for element in elements:
ids.append(element.get_attribute("id"))
print(ids)