元素无法点击 - 即使它存在

3
希望您能帮忙。我在Python和Selenium方面相对较新。我试图编写一个简单的脚本,以自动搜索各种网站上的新闻。主要关注足球,并从几个地方获取最新的曼联新闻,并保存链接标题和URL列表。然后我可以自己查看链接并选择任何我想审查的内容。
在尝试独立报纸(https://www.independent.co.uk/)时,我似乎遇到了一个元素不可交互的问题,使用以下方法:
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys 
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome('chromedriver')
driver.get('https://www.independent.co.uk')

time.sleep(3)

#accept the cookies/privacy bit
OK = driver.find_element_by_id('qcCmpButtons')
OK.click()

#wait a few seconds, just in case
time.sleep(5)


search_toggle = driver.find_element_by_class_name('icon-search.dropdown-toggle')
search_toggle.click()

这会抛出错误。
我也尝试使用XPath。
search_toggle = driver.find_element_by_xpath('//*[@id="quick-search-toggle"]')

我也尝试过使用ID。

我在这里阅读了很多内容,然后也尝试使用WebDriverWait和execute_script方法:

element = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '//*[@id="quick-search-toggle"]')))
driver.execute_script("arguments[0].click();", element)

这似乎没有出现错误,但搜索框从未出现,即适当的点击没有发生。

如果您能提供任何帮助,那将非常棒。 谢谢, 皮特


这听起来像是一个X-Y问题。不要仅仅问有关你解决问题的帮助,编辑你的问题并询问实际的问题是什么。你试图做什么? - undetected Selenium
我以为在解决方案之前的第一段已经解释清楚我想要实现什么了?也许没有 :( - peetysmith
3个回答

1

首先您需要打开搜索框,然后发送搜索关键词:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
import os

chrome_options = Options()
chrome_options.add_argument("--start-maximized")
browser = webdriver.Chrome(executable_path=os.path.abspath(os.getcwd()) + "/chromedriver", options=chrome_options)
link = 'https://www.independent.co.uk'
browser.get(link)

# accept privacy
button = browser.find_element_by_xpath('//*[@id="qcCmpButtons"]/button').click()

# open search box
li = browser.find_element_by_xpath('//*[@id="masthead"]/div[3]/nav[2]/ul/li[1]')
search_tab = li.find_element_by_tag_name('a').click()

# send keys to search box
search = browser.find_element_by_xpath('//*[@id="gsc-i-id1"]')
search.send_keys("python")
search.send_keys(Keys.RETURN)

1

您的定位器是//*[@id="quick-search-toggle"],页面上有2个。第一个是不可见的,第二个是可见的。默认情况下,Selenium引用第一个元素,遗憾的是,您需要的元素是第二个,因此您需要另一个唯一的定位器。尝试这个:

search_toggle = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//div[@class="row secondary"]//a[@id="quick-search-toggle"]')))
search_toggle.click()

1
太棒了 - 我已经在源代码中搜索过了,但可能错过了那个。谢谢。此外,我喜欢这里的XPATH设置,而不是绝对路径。再次感谢。 - peetysmith

0

你可以尝试以下步骤

search_toggle = driver.find_element_by_xpath('//*[@class="row secondary"]/nav[2]/ul/li[1]/a')

search_toggle.click()

它应该可以工作,但是“相对路径”比“绝对路径”更好。因为“绝对路径”具有足够高的易变性。 - frianH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接