如何使用Python和Selenium选择此按钮?

时间:2018-07-28 17:50:13

标签: python python-3.x selenium xpath

我正在尝试使用Python和Selenium在这些按钮上单击“是”或“否”:

enter image description here

这些按钮的HTML如下:

enter image description here

我尝试根据XPath进行选择:

isbnButton = browser.find_elements_by_xpath("//a[@data-toggle='haveisbn'")

是朋友建议的,但给我一个错误,指出该字符串不是有效的XPath表达式。我对XPath几乎一无所知,并且在我等待答案的同时正在做一个教程,但是我希望有人可以指导我正确的方向。

我最初尝试的是:

dontHaveISBN = driver.find_elements_by_class_name('btn radio btn-radio btn-primary not-active w-100')
dontHaveISBN[1].click()

但是那没有识别任何元素。

您将如何选择并单击这些按钮?

3 个答案:

答案 0 :(得分:1)

您可以再次尝试使用xpath(尝试从源代码中完全复制xpath):

dontHaveISBN=driver.find_element_by_xpath('xpath_here')
dontHaveISBN.click()

答案 1 :(得分:1)

您可以尝试使用以下代码:

wait = WebDriverWait(driver, 10)
yes_button = wait.until(EC.element_to_be_clickable((By.LINK_TEXT, 'Yes')))
yes_button.click()  

使用链接文本 XPATH 更好。

如果只想使用xpath,那就应该是:

//a[text()='Yes']

请注意,您必须导入以下内容:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC    

如果您想了解有关xpath的更多信息,可以参考此link

希望这会有所帮助。

答案 2 :(得分:1)

xpath中尝试忘记结束],这就是为什么它无效的原因。但是此定位器还有一个更大的问题:它也与NO按钮匹配。

class_name尝试中,您给多个类作为参数,find_elements_by_class_name仅接收了一个类作为参数。

data-id属性似乎是唯一的,您可以使用它

# Yes button
driver.find_element_by_css_selector('[data-id="1"]')

# No button
driver.find_element_by_css_selector('[data-id="0"]')

# using xpath
driver.find_element_by_xpath('//a[@data-id="1"]')

或使用文字

driver.find_element_by_link_text('Yes')

driver.find_element_by_xpath('//a[text()="Yes"]')