【问题标题】:How to Click Link Being Covered by Another Element? Python 3.6 and Selenium如何点击被另一个元素覆盖的链接? Python 3.6 和硒
【发布时间】:2019-06-09 02:04:17
【问题描述】:

无法弄清楚如何单击此页面表格底部的“下一步”按钮:

https://www.zacks.com/stocks/industry-rank/reit-and-equity-trust-other-266/stocks-in-industry

这是我尝试过的:

from bs4 import BeautifulSoup
import requests
import csv, random, time
from pandas.io.html import read_html
from selenium import webdriver
from selenium.webdriver.support.ui import Select


url = 'https://www.zacks.com/stocks/industry-rank/reit-and-equity-trust-other-266/stocks-in-industry'

    # Open Chrome
driver = webdriver.Chrome()

    # Send Chrome to the URL
page = driver.get(url)

    # Wait for page to load a few seconds
timeDelay = random.randrange(4, 8)
time.sleep(timeDelay)

    # Try to click the darn button
element = driver.find_element_by_xpath('//*[@id="industry_rank_table_next"]')
driver.execute_script("arguments[0].click();", element)  

...和

element = driver.find_element_by_xpath('//*[@id="industry_rank_table_next"]')
element.send_keys("\n")

...从其他答案中找到但对我不起作用。简单地使用.click() 是行不通的。我还尝试使用css_selectorpartial_link_textclass_name 选择按钮,但仍然没有成功。我在几个网站上遇到过这个。有什么想法吗?

【问题讨论】:

  • 试试element.click() ?
  • 即使按钮被另一个元素覆盖(我猜是页面底部的 Cookies 警告driver.execute_script("arguments[0].click();", element) 仍然可以工作。你有什么例外?
  • @Andersson 有趣的是,代码点击链接成功,但是我得到一个“selenium.common.exceptions.WebDriverException: Message: unknown error: call function result missing 'value'”错误,所以我将添加一个 try/except 选项来处理错误。我要更新了。感谢您的帮助!

标签: python-3.x selenium xpath css-selectors webdriverwait


【解决方案1】:

click() 元素上的文本为 Next,您必须诱导 WebDriverWait 以使 元素可点击,您可以使用以下任一解决方案:

  • 使用LINK_TEXT

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.LINK_TEXT, "Next"))).click()
    
  • 使用CSS_SELECTOR

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.paginate_button next#industry_rank_table_next"))).click()
    
  • 使用XPATH

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@class='paginate_button next' and @id='industry_rank_table_next']"))).click()
    
  • 注意:您必须添加以下导入:

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

【讨论】:

  • 谢谢你,这比使用睡眠功能更有帮助。
  • @MattWilson 但我希望这个答案也能解决你的问题。请问我可以得到一个状态吗?
  • 如果您看到 WebDriverException: Message: unknown error: call function result missing 'value' 这是由于 ChromeDriver 之间的版本不匹配造成的i>Chrome 浏览器
【解决方案2】:

如果你必须点击的元素有父元素,那么你可以通过 findElements 方法找到父元素,然后你只需要传递元素的索引,如 0 或 1 等.. 然后你可以执行点击对此采取行动

Want to click on third li from second ul:

   <ul id="select-123" style="width: 1180px; display: none;">
   <li class="" style="display:none;">
   <li class="">
   <li class="">
   <li class="">
   </ul>

   <ul id="select-123" style="width: 1180px; display: none;">
   <li class="" style="display:none;">
   <li class="">
   <li class="">
   <li class="">
   </ul>


Code I am trying is to select third li from second ul which does not work:

    driver.findElements(By.css(ul[id*='select-123'])).then(function(elems) {
    elems[2].then(function(lis) {
    driver.findElement(By.css("ul[id*='select-123'] li:nth-child(3)")).click();
    });
    });

【讨论】:

    【解决方案3】:

    如果您不想在代码中添加额外的等待并且只需单击按钮,则另一种方法:

    使用javascript点击:

    element = driver.find_element_by_xpath("//a[@class='paginate_button next' and @id='industry_rank_table_next']")
    driver.execute_script("arguments[0].click();", element)
    

    【讨论】:

      【解决方案4】:

      更新

      我之前没有注意到这一点,但是

      element = driver.find_element_by_xpath('//*[@id="industry_rank_table_next"]')
      driver.execute_script("arguments[0].click();", element)
      

      ...在成功单击链接时起作用,但给了我一个

      selenium.common.exceptions.WebDriverException: Message: unknown error: call function result missing 'value'
      

      ...点击链接后出错。所以为了解决这个问题,我刚刚添加了一个 try/except 来处理错误。即:

      try:
          element = driver.find_element_by_xpath('//*[@id="industry_rank_table_next"]')
          driver.execute_script("arguments[0].click();", element)
      except:
          pass
      

      ...这似乎有效。就我而言,这似乎是一个愚蠢的观察,但感谢大家的帮助。希望这里的一些东西将来可以帮助其他人。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-06
        • 1970-01-01
        • 2015-12-19
        • 2022-10-04
        • 2021-07-27
        相关资源
        最近更新 更多