我想遍历某些元素,然后单击它们。在此过程中,建议我使用Selenium的WebDriverWait,但是我遇到了一些困难,这些困难在尝试了一段时间后仍无法解决。
我的代码:
# finds all heart elements
hearts = driver.find_elements_by_xpath("//span[@class='fr66n']")
for h in range(len(hearts)):
try:
element = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.XPATH, hearts[h])));
ActionChains(driver).move_to_element(hearts[h]).click(hearts[h]).perform()
counter += 1
print(str(counter) + "/" + str(len(hearts)))
except exceptions.StaleElementReferenceException as e:
raise e
遇到错误:
selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: 'value' must be a string
它指向这一行:
element = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.XPATH, hearts[h])));
通过猜测,我认为它是指Hearts [h]应该是字符串,但是不是吗?希望我的解释是错误的,并且有人有更好的主意。谢谢。
答案 0 :(得分:2)
hearts[h]
是<element>
,但您可以将其用作Xpath定位器(By.XPATH, hearts[h])
,使用可以执行的索引来选择元素
xpathIndex = "(//span[@class='fr66n'])[{}]".format(h+1) # xpath index start from 1 not 0
# (//span[@class='fr66n'])[1]
element = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.XPATH, XpathIndex)));
ActionChains(driver).move_to_element(hearts[h]).click(hearts[h]).perform()
# or
# ActionChains(driver).move_to_element(element).click(element).perform()