【问题标题】:Python+Selenium, can't click the 'button' wrapped by spanPython + Selenium,无法单击由span包裹的“按钮”
【发布时间】:2017-01-16 21:04:24
【问题描述】:

我是这里的硒新手。每次刷新页面后,我都尝试使用 selenium 单击“更多”按钮以展开评论部分。

网站是 TripAdvisor。 more按钮的逻辑是,只要你点击第一个more按钮,它就会自动为你展开所有的评论区。换句话说,您只需要点击第一个“更多”按钮。

所有按钮都有相似的类名。例如taLnk.hvrIE6.tr415411081.moreLink.ulBlueLinks。只有数字部分每次都会改变。

完整的元素如下所示:

<span class="taLnk hvrIE6 tr413756996 moreLink ulBlueLinks" onclick="          var options = {
      flow: 'CORE_COMBINED',
      pid: 39415,
      onSuccess: function() { ta.util.cookie.setPIDCookie(2247); ta.call('ta.servlet.Reviews.expandReviews', {type: 'dummy'}, ta.id('review_413756996'), 'review_413756996', '1', 2247);; window.location.hash = 'review_413756996'; }
    };
    ta.call('ta.registration.RegOverlay.show', {type: 'dummy'}, ta.id('review_413756996'), options);
    return false;
  ">
More&nbsp; </span>

我尝试了几种方法来获得按钮点击。但由于它是一个由 span 包装的 onclick 事件,我无法成功点击它。

我的上一个版本是这样的:

driver = webdriver.Firefox()
driver.get(newurl)
page_source = driver.page_source
soup = BeautifulSoup(page_source)
moreID = soup.find("span", class_=re.compile(r'.*\bmoreLink\b.*'))['class']
moreID = '.'.join(moreID[0:(len(moreID)+1)])
moreButton = 'span.' + moreID
button = driver.find_element_by_css_selector(moreButton)
button.click()
time.sleep(10)

但是,我不断收到这样的错误消息:

WebDriverException: 消息: 元素在点 (318.5, 7.100006103515625)。其他元素会收到点击......

你能告诉我如何解决这个问题吗?任何帮助将不胜感激!

【问题讨论】:

  • 另外,我尝试了等待功能 - {WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, more)))} 并得到一个空的错误消息

标签: python selenium onclick css-selectors webdriver


【解决方案1】:

尝试使用ActionChains

from selenium.webdriver.common.action_chains import ActionChains
# Your existing code here
# Minus the `button.click()` line
ActionChains(driver).move_to_element(button).cli‌​ck().perform()

当我需要点击&lt;div&gt;&lt;span&gt; 元素而不是实际的按钮或链接时,我使用了这种技术。

【讨论】:

  • 谢谢 elethan。我试过了。但我仍然收到与我的问题相同的错误消息。
  • @backpackerice 你确定要摆脱你原来给button.click()的电话吗?
  • @elethan。是的,我做到了。我想知道这是否是因为附近有另一个跨度完全相同的大小、相同的类名、相同的 onlick 值、相同的所有内容。因此,当我尝试单击此跨度的坐标时,另一个按钮将其停止。为了清楚起见,有两种类型的“更多”按钮。一个扩展评论内容,另一个扩展响应内容。我只需要单击该页面上的第一个“更多”按钮。不管是哪一种。我认为 find.element (w/o s) 将帮助我找到第一个。但它没有。
  • @backpackerice 您可以尝试find_elements_by... 方法之一,而不是find_element_by... 方法。这些方法将返回一个元素列表,您可能能够从该列表中获取正确的元素。例如,在您的情况下:buttons = driver.find_elements_by_css_selector(moreButton) 将为您提供一个带有匹配 moreButton 的 css 选择器的元素列表。您确定button 当前指向页面上的哪个元素吗?
  • 谢谢。我使用了 ActionChains 并且能够使其成功运行一次。但是,它在下一次运行时失败了。可能是因为连接问题。不过谢谢!
【解决方案2】:

WebDriverException:消息:元素在点 (318.5、7.100006103515625) 处不可点击。其他元素会收到点击......

当元素不在视口中并且 selenium 由于其上的一些其他覆盖元素而无法单击时会发生此错误。在这种情况下,您应该尝试以下解决方案之一:-

  • 您可以尝试在点击之前使用ActionChains 到达该元素,如下所示:-

    from selenium.webdriver.common.action_chains import ActionChains
    
    button = driver.find_element_by_css_selector(moreButton)
    
    ActionChains(button).move_to_element(element).click().perform()
    
  • 您可以尝试在点击之前使用execute_script() 到达该元素:-

    driver.execute_script("arguments[0].scrollIntoView(true)", button)
    button.click()
    
  • 您可以尝试将JavaScript::click()execute_script() 一起使用,但这JavaScript::click() 违背了测试的目的。首先是因为它不会生成像真正的单击(焦点、模糊、mousedown、mouseup...)这样的所有事件,其次是因为它不能保证真正的用户可以与元素进行交互。但要摆脱这个问题,您可以将其视为替代解决方案。

    driver.execute_script("arguments[0].click()", button)
    

注意:- 在使用这些选项之前,请确保您尝试使用正确的定位器与正确的元素进行交互,否则在使用 @987654330 等到元素可见和可点击后,WebElement.click() 会很好地工作@。

【讨论】:

  • 谢谢! driver.execute_script("arguments[0].click()", button) 对我有用
猜你喜欢
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
相关资源
最近更新 更多