如何找到并点击带有硒的隐藏按钮?

时间:2015-12-22 09:49:29

标签: 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))

似乎有效,但会在0中返回hrefs个条目。但是在firefox的检查器中我明显可以在给定id的元素中看到这个元素:

enter image description here

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

P.S。我无法使用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" -button元素(参见问题中的图片)。

1 个答案:

答案 0 :(得分:2)

我尝试了两种不同的方法

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查找元素可以相对于其他元素 。来自文档:

  

您可以使用XPath以绝对值定位元素(不是   建议),或相对于具有id或名称的元素   属性。

因此,第二种方法为您提供了所需元素的列表

<强>更新

真正的问题是,只有将鼠标悬停在父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()