【问题标题】:Why click function is not working on page, but it works on console?为什么单击功能在页面上不起作用,但在控制台上起作用?
【发布时间】:2023-04-09 05:32:02
【问题描述】:

我正在尝试提取我的一个联系人帖子的 LinkedIn 反应。我想使用 Selenium 和 python 点击​​一个元素。在控制台上它可以工作,它说该元素是可点击的,但在页面上它什么也不触发。

post = driver.find_element_by_xpath("//div[@class='occludable-update ember-view']")
like = (post.find_element_by_xpath(".//span[@class='v-align-middle social-details-social-counts__reactions-count']"))

print(like)
try:
    like.click()
    print('Element is clickable')
except WebDriverException:
    print('Element is not clickable')

--------
Output:
<selenium.webdriver.remote.webelement.WebElement (session="f08fca13c4b757b1e07f510ac3e87d5b", element="daf1ed78-87f1-4742-ab6b-155bc3bbec2f")>
Element is clickable

【问题讨论】:

  • 可以分享网址吗?
  • 只需转到某人的个人资料 -> 活动 -> 帖子或https://www.linkedin.com/in/linkedinName/detail/recent-activity/shares/
  • 啊,你想点击反应链接吗?在所有帖子上还是仅在第一个帖子上?
  • @PaulViorel - 它什么都没有触发 - 你看不到显示名字的弹出窗口吗?浏览器窗口会立即关闭吗?当我尝试您的代码时,time.sleep(5)like.click() 之后,能够看到弹出窗口。
  • @pmadhu yeaa.. 谢谢.. 它适用于time.sleep(5)...

标签: python selenium selenium-webdriver webdriver selenium-chromedriver


【解决方案1】:

如果是你想点击的反应按钮,那么我建议你有:

  1. 可靠的定位器。
  2. 显式等待。

代码:-

wait = WebDriverWait(driver, 20)
post = wait.until(EC.visibility_of_element_located((By.XPATH, "//div[@class='occludable-update ember-view']")))
like = post.find_element_by_xpath(".//span[@class='v-align-middle social-details-social-counts__reactions-count']/..")

try:
    time.sleep(2)
    like.click()
    print('Element is clicked')
except:
    print('Element was not clicked')

进口:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

【讨论】:

  • 它在点击代码行之前与time.sleep(5)一起工作。我会用你的方法试一试,因为它看起来更好。
  • 是的,大多数情况下它会起作用,因为WebDriverWait 基本上是显式等待,1time.sleep(5)` 也是如此,但 time.sleep 是最糟糕的,因为它为定义的线程设置了冻结时间。
  • 当它发现更多有反应的帖子时仍然不起作用。也许我应该将 WebDriverWait 的第二个参数增加到 50 或更多?
  • 不,20 应该足够了。您是否在寻找超过 1 个元素?
  • 是的。现在我正在寻找前 10 个帖子。但我的目标是获得超过 100 个帖子的反应。
【解决方案2】:

Put Explicit 等到弹出窗口可见。

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import time

driver = webdriver.Chrome(executable_path="path to chromedriver.exe")
driver.maximize_window()
driver.implicitly_wait(20)
wait = WebDriverWait(driver,30)
driver.get("https://www.linkedin.com/")
post = driver.find_element_by_xpath("//div[@class='occludable-update ember-view']")
like = (post.find_element_by_xpath(".//span[@class='v-align-middle social-details-social-counts__reactions-count']"))


print(like)
try:
    like.click()
    wait.until(EC.visibility_of_element_located((By.XPATH,"//div[@class='social-details-reactors-tab__icon-container']")))
    print('Element is clickable')
    print(driver.find_element_by_xpath("//div[@class='social-details-reactors-tab__icon-container']//span[2]").text) # Prints the respective count of reactions.
except Exception as e:
    print(e)
    print('Element is not clickable')
driver.quit()

输出:

<selenium.webdriver.remote.webelement.WebElement (session="b2a5f095db328a8252be0e95f980f89f", element="28668dd1-22c5-423a-b17e-273ea29f3f86")>
Element is clickable
2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 2019-03-26
    • 2016-05-29
    相关资源
    最近更新 更多