Python Selenium:无法为特定按钮修复NoSuchElementException

时间:2019-04-08 09:53:29

标签: python selenium selenium-webdriver webdriver webdriverwait

我正在尝试在python中按下带有硒的按钮。我无法使用xpath或CSS选择器找到它。

对于脚本中的其他内容,我一直在使用xpath,它可以正常工作,但是每次打开它时,此按钮的xpath似乎都是相对的。因此,我尝试使用css选择器进行访问。

我要访问的元素看起来像这样:

<button type="button" data-dismiss="modal" class="btn btn-primary pull-right">Opret AnnonceAgent</button>

Chrome浏览器中的css选择器:

#\35 d167939-adc2-0901-34ea-406e6c26e1ab > div.modal-footer > div > button.btn.btn-primary.pull-right

让我知道是否应该发布更多html。

我已经尝试了许多堆栈oveflow问题,并尝试了css选择器的许多变化,例如将其放置为:

  • driver.find_element_by_class_name('#\35 d167939-adc2-0901-34ea-406e6c26e1ab.div.modal-footer.div.button.btn.btn-primary.pull-rightdiv.button.btn.btn-primary-pull-right').click()

  • driver.find_element_by_class_name('div.button.btn.btn-primary-pull-right').click()

  • driver.find_element_by_class_name('button.btn.btn-primary-pull-right').click()

  • driver.find_element_by_class_name('btn.btn-primary-pull-right').click()

  • driver.find_element_by_class_name('btn-primary-pull-right').click()

我还尝试了一个睡眠计时器。

该按钮位于一个窗口中,当您按上一个按钮时,背景会变灰,如果有帮助的话。 Picture

# This opens up the window in which to press the next button (works fine)
button = driver.find_element_by_xpath('//*[@id="content"]/div[1]/section/div[2]/button')
button.click()
driver.implicitly_wait(15)
time.sleep(5)
# This is what doesn't work
driver.find_element_by_class_name('button.btn.btn-primary-pull-right').click()

我希望程序按下按钮,但不会,它只是坐在那里。

3 个答案:

答案 0 :(得分:1)

所需元素在模态对话框中,因此您需要诱使 WebDriverWait 使所需元素可点击,并且使用以下Locator Strategies之一:

  • 使用CSS_SELECTOR

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.btn.btn-primary.pull-right[data-dismiss='modal']"))).click()
    
  • 使用XPATH

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='btn btn-primary pull-right' and @data-dismiss='modal'][text()='Opret AnnonceAgent']"))).click()
    
  • 注意:您必须添加以下导入:

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

答案 1 :(得分:0)

class_name接收一个类作为参数,但是您正在使用css语法作为定位符。

使用css_selector

driver.find_element_by_css_selector('button.btn.btn-primary-pull-right')

这意味着<button>标签具有2个类别,btnbtn-primary-pull-right

使用class_name

driver.find_element_by_class_name('btn-primary-pull-right')

答案 2 :(得分:0)

我的猜测是正确的。有一个iframe停止访问该元素。您必须先切换到iframe才能访问button元素。现在尝试以下代码。

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

#WebDriverWait(driver,20).until(expected_conditions.frame_to_be_available_and_switch_to_it((By.XPATH,'//iframe[starts-with(@id,"rdr_")]')))
WebDriverWait(driver,20).until(expected_conditions.frame_to_be_available_and_switch_to_it((By.XPATH,'//iframe[@id="qualaroo_dnt_frame"]')))
driver.find_element_by_css_selector('button.btn.btn-primary').click()