首页 > 解决方案 > 如何使用 Selenium 和 Javascript 修复无法读取 null 错误的属性“点击”

问题描述

我正在使用 Selenium Python 创建一个机器人。我正在尝试单击不可见的元素(仅在单击按钮以展开树后可见),因此我正在使用 JavaScript 执行如下脚本:

entity_ID = '1200'
js = """document.querySelector("div[data-id='{0}']").click()""".format(entity_ID)
driver.execute_script(js)

这返回JavascriptException: Message: javascript error: Cannot read property 'click' of null。如果我展开树以使元素可见,则上述代码运行成功。如果我折叠树以使元素不再可见......上面的代码运行成功。为什么这仅在元素可见或过去可见时才有效?

元素(在树内)如下所示:

<div class="rowContainer js-tree-row AssessmentTreeGrid unselectable ui-selected treegridinlineedit" data-id="1200" data-type="15005" data-bid="0" data-role="1" data-key="false" data-testresult="0" data-strategic="false" data-released="false" data-mtallowedactions="12600,11800,8700,12000,8100,32200,32400,5400,26300,26400,32600,32500,32100,19500" data-mtunallowedactions="" data-mtunallowedactionreasons="" data-uiallowedactions="500,600" data-allowedreorder="false" data-collapsible="true" tabindex="0" unselectable="on">

完整的回溯如下所示:

JavascriptException                       Traceback (most recent call last)
<ipython-input-332-7945dcef4da6> in <module>
----> 1 driver.execute_script(js)

~\AppData\Local\conda\conda\envs\robotics\lib\site-packages\selenium\webdriver\remote\webdriver.py in execute_script(self, script, *args)
    634         return self.execute(command, {
    635             'script': script,
--> 636             'args': converted_args})['value']
    637 
    638     def execute_async_script(self, script, *args):

~\AppData\Local\conda\conda\envs\robotics\lib\site-packages\selenium\webdriver\remote\webdriver.py in execute(self, driver_command, params)
    319         response = self.command_executor.execute(driver_command, params)
    320         if response:
--> 321             self.error_handler.check_response(response)
    322             response['value'] = self._unwrap_value(
    323                 response.get('value', None))

~\AppData\Local\conda\conda\envs\robotics\lib\site-packages\selenium\webdriver\remote\errorhandler.py in check_response(self, response)
    240                 alert_text = value['alert'].get('text')
    241             raise exception_class(message, screen, stacktrace, alert_text)
--> 242         raise exception_class(message, screen, stacktrace)
    243 
    244     def _value_or_default(self, obj, key, default):

JavascriptException: Message: javascript error: Cannot read property 'click' of null
  (Session info: chrome=78.0.3904.97)

标签: javascriptpythonseleniumselenium-webdriverclick

解决方案


尝试运行测试直到点击,在浏览器的控制台中运行:

document.querySelector("div[data-id='<ID>']")

如果您看到“空”,则:

  1. 对象不存在;
  2. 您应该等待显示对象。

推荐阅读