如何点击Link被其他元素覆盖? Python 3.6 和硒

How to Click Link Being Covered by Another Element? Python 3.6 and Selenium

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

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 选择按钮,但仍然没有成功。我已经 运行 在一些网站上对此进行了研究。有什么想法吗?

如果您必须单击的元素有父元素,那么您可以通过 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();
    });
    });

To 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
    

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

使用 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)

更新:

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

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

...在成功点击 link 时工作,但给了我

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

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

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

...这似乎有效。对我而言,这似乎是一个愚蠢的观察,但感谢大家的帮助。希望这里的内容能在将来对其他人有所帮助。