Python Selenium - 根据样式属性单击css元素或包含子元素的文本?推特关注

Posted

技术标签:

【中文标题】Python Selenium - 根据样式属性单击css元素或包含子元素的文本?推特关注【英文标题】:Python Selenium - Clicking css elements based on style attributes or containing text of child element? Twitter following 【发布时间】:2018-04-06 23:38:18 【问题描述】:

为了消除任何混淆,我的最终目标是点击我尚未关注的用户的所有关注按钮。

您好,我已经为此挂断了几个小时,感谢您提供任何意见。我正在尝试单击页面上包含“关注”文本的所有按钮,以避免由于标记的性质以及单击按钮如何关注和取消关注用户而点击我已经关注的用户的按钮。

旁注:当用户未被关注时,“user-actions-follow-button js-follow-btn follow-button”的第一个按钮兄弟元素将显示属性从 display:none 更改为 display:block。

我将如何完成这项任务?当我尝试单击该项目时出现错误。

html_list = driver.find_element_by_css_selector(".Grid--withGutter")
items = html_list.find_elements_by_css_selector(".follow-text")

for item in items:
item.click()

到目前为止有效但与已经关注的用户没有区别,因此它取消关注我已经关注的用户。

driver.find_elements_by_css_selector('.user-actions-follow-button')[count].click()

这是单个按钮的示例,页面将包含几十个。

<span class="user-actions-follow-button js-follow-btn follow-button">
  <button type="button" class="EdgeButton EdgeButton--secondary EdgeButton--small button-text follow-text">
    <span aria-hidden="true">Follow</span>
    <span class="u-hiddenVisually">Follow 
      <span class="username u-dir" dir="ltr">@<b>jefken11</b></span>
    </span>
  </button>
  <button type="button" class="EdgeButton EdgeButton--primary EdgeButton--small button-text following-text">
    <span aria-hidden="true">Following</span>
    <span class="u-hiddenVisually">Following 
      <span class="username u-dir" dir="ltr">@<b>jefken11</b></span>
    </span>
  </button>
  <button type="button" class="EdgeButton EdgeButton--danger EdgeButton--small button-text unfollow-text">
    <span aria-hidden="true">Unfollow</span>
  <span class="u-hiddenVisually">Unfollow 
    <span class="username u-dir" dir="ltr">@<b>jefken11</b></span>
    </span>
  </button>
  <button type="button" class="EdgeButton EdgeButton--invertedDanger EdgeButton--small button-text blocked-text">
    <span aria-hidden="true">Blocked</span>
    <span class="u-hiddenVisually">Blocked 
      <span class="username u-dir" dir="ltr">@<b>jefken11</b></span>
    </span>
  </button>
  <button type="button" class="EdgeButton EdgeButton--danger EdgeButton--small button-text unblock-text">
    <span aria-hidden="true">Unblock</span>
    <span class="u-hiddenVisually">Unblock 
      <span class="username u-dir" dir="ltr">@<b>jefken11</b></span>
    </span>
  </button>
  <button type="button" class="EdgeButton EdgeButton--secondary EdgeButton--small button-text pending-text">
    <span aria-hidden="true">Pending</span>
    <span class="u-hiddenVisually">Pending follow request from 
      <span class="username u-dir" dir="ltr">@<b>jefken11</b></span>
    </span>
  </button>
  <button type="button" class="EdgeButton EdgeButton--secondary EdgeButton--small button-text cancel-text">
    <span aria-hidden="true">Cancel</span>
    <span class="u-hiddenVisually">Cancel your follow request to 
      <span class="username u-dir" dir="ltr">@<b>jefken11</b></span>
    </span>
  </button>
</span>

我收到的错误:

>Traceback (most recent call last):
  File "/home/dznutts/PycharmProjects/untitled/twitter_follow.py", line 142, in <module>
    browserWork()
  File "/home/dznutts/PycharmProjects/untitled/twitter_follow.py", line 115, in browserWork
    item.click()
  File "/usr/local/lib/python3.5/dist-packages/selenium/webdriver/remote/webelement.py", line 80, in click
    self._execute(Command.CLICK_ELEMENT)
  File "/usr/local/lib/python3.5/dist-packages/selenium/webdriver/remote/webelement.py", line 501, in _execute
    return self._parent.execute(command, params)
  File "/usr/local/lib/python3.5/dist-packages/selenium/webdriver/remote/webdriver.py", line 308, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.5/dist-packages/selenium/webdriver/remote/errorhandler.py", line 194, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotInteractableException: Message: 

【问题讨论】:

“当我尝试单击该项目时出现错误。”回溯的完整错误消息是什么? 感谢您的宝贵时间,已根据错误进行了更新。 用英语,你想做什么?关注你所有的追随者或???我仍然对您的尝试感到困惑。 我正在尝试关注所有尚未关注的用户。 【参考方案1】:

如果您要做的是单击所有可见的包含“Following X”的BUTTONs,它们都具有following-text 的CSS 类。为什么不使用它?

items = driver.find_elements_by_css_selector("button.following-text")
visible_items = [item for item in items if item.is_displayed()]
for item in visible_items
    item.click()

【讨论】:

非常感谢您的回答。我对python很陌生。打算试一试并报告。 py",第 308 行,在执行 self.error_handler.check_response(response) 文件“/usr/local/lib/python3.5/dist-packages/selenium/webdriver/remote/errorhandler.py ",第 194 行,在 check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.ElementNotInteractableException: Message: Try it but no dice. 我认为这是由于其中一个元素不可见,我已更新代码以将元素列表过滤为仅可见的元素。试试看。 非常感谢您的努力,会试一试并报告。 此代码有效,但它仍然会继续并单击每个关注按钮,这会导致取消关注之前关注的用户并提出原始问题。

以上是关于Python Selenium - 根据样式属性单击css元素或包含子元素的文本?推特关注的主要内容,如果未能解决你的问题,请参考以下文章

python万字博文教你玩嗨selenium库,建议收藏!

使用 Selenium,如何根据关联标签单击单选按钮

Python selenium根据class定位页面元素

python+selenium 方法大全

如何使用 selenium webdriver C# 获取元素样式属性的值

selenium+python学习——webdriver总结