如何根据Selenium和Python提供的HTML定位元素

时间:2018-07-17 00:01:38

标签: python selenium selenium-webdriver xpath css-selectors

我试图用Python在Selenium中单击“下一步”按钮,其源代码为:

<div class="form-group clearfix">
            <button id="experiment-method-previous" type="button" class="btn btn-dark pull-left" ng-click="navigate('run',$event)">Previous</button>
            <button id="experiment-method-next" type="button" class="btn btn-primary pull-right" ng-click="navigate('export',$event)">Next</button>
        </div>

我使用以下行:

driver.find_element_by_id('experiment-method-next')

但我收到此错误:

Unable to locate element: [id="experiment-method-next"]

相同
driver.find_element_by_class_name('btn btn-primary pull-right')
Unable to locate element: .btn btn-primary pull-right

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

根据您共享的 HTML ,在元素上调用click(),文本为 Next ,您必须诱使 WebDriverWait 为所需的元素可点击,您可以使用以下任一解决方案:

  • CSS_SELECTOR

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.btn.btn-primary.pull-right#experiment-method-next"))).click()
    
  • XPATH

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='btn btn-primary pull-right' and @id='experiment-method-next']"))).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 :(得分:1)

我认为您的要素位于frame/iframe内部。为了能够与frame/iframe中的元素进行交互,您必须像这样切换其内容:

WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, "//path_to_frame")))

然后您可以找到您的元素并与之交互:

WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "experiment-method-next"))).click()

,当您完成frame中的内容后,您必须切换回默认内容:

driver.switch_to.default_content()

注意: ,您必须进行一些导入:

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

PS: :如果您的元素不在框架内,则只需使用WebDriverWait

WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "experiment-method-next"))).click()

这将至少等待10秒钟,直到元素可单击并对其单击。希望这会有所帮助。

答案 2 :(得分:1)

我找到的解决方案是先杀死我的应用程序打开的所有以前的窗口,然后切换到最新的窗口:

current_window = driver.window_handles[1]
driver.switch_to_window(current_window)

现在,可以按以下方式单击“下一步”按钮: driver.find_element_by_id('experiment-method-next').click()

非常感谢用户 Andrei Suvorkov DebanjanB 的帮助。