我正在尝试使用 selenium python 脚本来尝试单击一个按钮,该按钮仅在鼠标悬停在网页的特定区域上时才可见。目前我使用的代码如下:
driver = webdriver.Firefox()
driver.implicitly_wait(20)
driver.get("https://www.swisscom.ch/de/privatkunden/mobile/devices.html")
element = driver.find_element_by_xpath("//div[@id='gridProduct10247118']")
hrefs = element.find_elements_by_class_name('primary-button')
print(len(hrefs))
这似乎有效,但在 hrefs
中返回了 0
个条目。但是在 firefox 的检查器中,我可以清楚地在给定的 id
元素中看到这个元素:
我做错了什么?如何找到该按钮元素并能够单击它?
附言我无法使用 selenium ( see here ) 的记录功能,因为按钮仅在鼠标悬停在某个元素上方时才可见,如下所示:
附录:
鉴于“帮助”,我将脚本中的一行更改为:
hrefs = element.hover().find_elements_by_class_name('primary-button').click()
这给出了一个错误:
AttributeError: 'WebElement' object has no attribute 'hover'
Andersson帮助的补充:我修改了部分代码如下:
element = driver.find_element_by_xpath("//div[@id='gridProduct10247118']")
hover = ActionChains(driver).move_to_element(element)
hover.perform()
hrefs = hover.find_elements_by_xpath("//a[@class='primary-button']")
但出现错误
AttributeError: 'ActionChains' object has no attribute 'find_elements_by_xpath'
如果我改用下面这行代码:
hrefs = element.find_elements_by_xpath("//a[@class='primary-button']")
我得到了 9 个元素,尽管我只希望有一个“Bestellen”按钮元素(请参阅问题中的图片)。
最佳答案
我尝试了两种不同的方法
driver = webdriver.Firefox()
print driver
driver.implicitly_wait(20)
driver.get("https://www.swisscom.ch/de/privatkunden/mobile/devices.html")
直接查找class_name = 'primary-button'的元素
hrefs = driver.find_elements_by_class_name('primary-button')
print hrefs
print(len(hrefs))
结果:
[<selenium.webdriver.remote.webelement.WebElement object at 0xe390d0>, <selenium.webdriver.remote.webelement.WebElement object at 0xe39290>, <selenium.webdriver.remote.webelement.WebElement object at 0xe39250>, <selenium.webdriver.remote.webelement.WebElement object at 0xe391d0>, <selenium.webdriver.remote.webelement.WebElement object at 0xe394d0>, <selenium.webdriver.remote.webelement.WebElement object at 0xe4ed10>, <selenium.webdriver.remote.webelement.WebElement object at 0xe4ecd0>, <selenium.webdriver.remote.webelement.WebElement object at 0xe4ec50>, <selenium.webdriver.remote.webelement.WebElement object at 0xe4ec10>, <selenium.webdriver.remote.webelement.WebElement object at 0xe4ec90>]
10
在 div 元素上使用 xpath 查找所有按钮
element = driver.find_element_by_xpath("//div[@id='gridProduct10247118']")
hrefs = element.find_elements_by_xpath("//a[@class='primary-button']")
print hrefs
print len(hrefs)
结果:
[<selenium.webdriver.remote.webelement.WebElement object at 0xe4ee10>, <selenium.webdriver.remote.webelement.WebElement object at 0xe4ee50>, <selenium.webdriver.remote.webelement.WebElement object at 0xe4ee90>, <selenium.webdriver.remote.webelement.WebElement object at 0xe4eed0>, <selenium.webdriver.remote.webelement.WebElement object at 0xe4ef10>, <selenium.webdriver.remote.webelement.WebElement object at 0xe4ef50>, <selenium.webdriver.remote.webelement.WebElement object at 0xe4ef90>, <selenium.webdriver.remote.webelement.WebElement object at 0xe4efd0>, <selenium.webdriver.remote.webelement.WebElement object at 0xe58050>]
9
以及您的方法:
element = driver.find_element_by_xpath("//div[@id='gridProduct10247118']")
hrefs = element.find_elements_by_class_name('primary-button')
print hrefs
print len(hrefs)
结果:
[]
0
另一方面,通过 xpath 查找元素可以相对于其他元素 .来自文档:
You can use XPath to either locate the element in absolute terms (not advised), or relative to an element that does have an id or name attribute.
因此第二种方法为您提供了所需元素的列表
更新:
真正的问题是,直到您将鼠标悬停在父 div 上时,目标元素才可见。
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Firefox()
driver.get("https://www.swisscom.ch/de/privatkunden/mobile/devices.html")
div_element = WebDriverWait(driver, 60).until(expected_conditions.presence_of_element_located((By.ID, 'gridProduct10247118')))
hover = ActionChains(driver).move_to_element(div_element)
hover.perform()
button = WebDriverWait(driver, 30).until(expected_conditions.presence_of_element_located((By.XPATH, "//div[@id='gridProduct10247118']//a[@class='primary-button']")))
hover = ActionChains(driver).move_to_element(button)
hover.perform()
button.click()
关于python - 如何找到并单击带有 Selenium 的隐藏按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34412843/