python - 如何找到并单击带有 Selenium 的隐藏按钮?

标签 python html css selenium

我正在尝试使用 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 元素中看到这个元素:

enter image description here

我做错了什么?如何找到该按钮元素并能够单击它?

附言我无法使用 selenium ( see here ) 的记录功能,因为按钮仅在鼠标悬停在某个元素上方时才可见,如下所示:

enter image description 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/

相关文章:

html - BG 图像鼠标悬停工作正常,除了在 IE 上

javascript - 将背景图像放在下拉菜单的右侧

python - 在另一个线程中运行函数

python - 使用 Pandas 计算固定时间范围之间的总和

python - Odoo 9 空 TreeView

javascript - 为什么不在我的 iPad 上加载第一个图像

python - 在 python 多处理池中共享 numpy 数组

html - 宽高台卷轴

javascript - 函数中参数传入出错

css - CKEditor - 选项卡