企业微信-创建部门,selenium点击选择所属部门,报:element click intercepted

使用selenium在web 版企业微信上面创建部门,无法正常选择所属部门

    def addParty(self):
        self._driver.find_element(By.XPATH, '//*[@class="member_colLeft_top_addBtn"]').click()
        self._driver.find_element(By.CSS_SELECTOR, '.js_create_party').click()
        self._driver.find_element(By.CSS_SELECTOR, '[name=name]').send_keys('质量管理部')
        #点击所属部门 选择列表
        self._driver.find_element(By.CSS_SELECTOR,'.js_parent_party_name').click()
        #点击 研发中心
        self._driver.find_element(By.XPATH,"//*[@id='1688853331729457_anchor']").click()

        # self._driver.execute_script("document.getElementById('1688853331729457_anchor').click()")
        
# parentParty = self._driver.find_element(By.CSS_SELECTOR,'qui_dialog_body.ww_dialog_body[id="1688853331729457_anchor"]')
        # webdriver.ActionChains(self._driver).move_to_element(parentParty).click(parentParty).perform()
        self._driver.find_element(By.CSS_SELECTOR,'[id=__dialog__MNDialog__] div>div>a:nth-child(1)').click()

FAILED [100%]
test_contacts.py:42 (TestContact.test_addParty)
self = <workWeiXinMain.test_case.test_contacts.TestContact object at 0x7f9dcac48460>

def test_addParty(self):
  self.contactsPage.addParty()

test_contacts.py:44:


…/page/contacts.py:75: in addParty
self._driver.find_element(By.XPATH,"//*[@id=‘1688853331729457_anchor’]").click()
…/…/nvenv/lib/python3.8/site-packages/selenium/webdriver/remote/webelement.py:80: in click
self._execute(Command.CLICK_ELEMENT)
…/…/nvenv/lib/python3.8/site-packages/selenium/webdriver/remote/webelement.py:633: in _execute
return self._parent.execute(command, params)
…/…/nvenv/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py:321: in execute
self.error_handler.check_response(response)


self = <selenium.webdriver.remote.errorhandler.ErrorHandler object at 0x7f9dcac33be0>
response = {‘status’: 400, ‘value’: ‘{“value”:{“error”:“element click intercepted”,“message”:“element click intercepted: Element …fff6aa95109 _pthread_start + 148\n24 libsystem_pthread.dylib 0x00007fff6aa90b8b thread_start + 15\n”}}’}

1 个赞

这里有几个知识点:

  1. id是与前端约定唯一,而不是语法限制前端必须唯一。企业微信的部分id就是动态且不唯一的。
  2. 组合定位

解决思路

先按照正常流程找到部门对应的id

在console里面验证定位是否会有重复的情况,验证过程中发现本来是要选弹窗内部门,发现选择成了弹窗外,页面内的部门。

如果要解决此类问题,需要先定位到弹窗的位置,图片中示例通过css定位".qui_dialog_body.ww_dialog_body"定位到弹窗(自己手动尝试,不要复制)

定位到弹窗之后,再加上想要选取的部门id,即可定位成功
".qui_dialog_body.ww_dialog_body [id='1688852868031684_anchor']"

1 个赞

我按照你的思路进行了修改,已可以找到我要的记录。
但是我还有一个疑问:
css selector查找方式:"[id=‘1234’]" 和"#1234" 是不是一样的啊?
为什么 $(".qui_dialog_body.ww_dialog_body [id=‘1688853355778671_anchor’]") 可以找到元素,$(".qui_dialog_body.ww_dialog_body #1688853355778671_anchor")却找不到呢?

应该是css 表达式的语法要求。

$(".qui_dialog_body.ww_dialog_body [id=‘1688851348010191_anchor’]")

qui_dialog_body ww_dialog_body
想问下ww前面的.代表什么意思 原始的是没有的 我拷过来就一直没找到元素,加上点就能找到

. 是css 属性的简写。属于css的知识,录播的元素和定位方式也有讲解


今天在定位的时候发现,按老师的方法定位,如果存在多级部门,且二级部门是默认未展开的,未展开的部门下的子部门,就算拿到了Id,也是无法定位的,未展开的部门的li标签内的属性aria-expanded=“false”,若展开了则aria-expanded=“true”,若无法展开,则没有aria-expanded属性
所以,我的解决方案是,通过".js_party_list_container > div >ul:nth-child(1)"定位到部门下拉后的第一个根部门下的内容,然后通过遍历递归按顺序打开所有关闭项,再通过文本/Id匹配定位项,再执行点击操作
具体代码如下,有其他方案的朋友可以交流一下: