我正在尝试使用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
的元素中看到这个元素:
我做错了什么?如何找到该按钮元素并能够单击它?
P.S。我无法使用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" -button元素(参见问题中的图片)。
答案 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()