【问题标题】:How to locate an element as per the HTML provided through Selenium and Python如何根据 Selenium 和 Python 提供的 HTML 定位元素
【发布时间】:2018-07-17 00:01:38
【问题描述】:

我正在尝试使用 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

有什么想法吗?

【问题讨论】:

  • 最终的 HTML 出现在这些代码行之后有什么不同吗(基本上我在前一个按钮上双击)? text = driver.find_element_by_id("5c87b90f-dd40-4c5e-9e1f-3a926ee77ecb-icon") actionChains = ActionChains(driver) actionChains.double_click(text).perform()。最终的 HTML 在我的浏览器的不同选项卡上打开。

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


【解决方案1】:

根据您共享的 HTML,以在文本为 Next 的元素上调用 click(),您必须诱导 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

【讨论】:

  • 对于 CSS_SELECTOR:文件“”,第 59 行,在 WebDriverWait(driver, 60).until(EC.element_to_be_clickable((By.CSS_SELECTOR, “button.btn.btn-primary.pull-right#experiment-method-next”))).click() 文件“/anaconda3/lib/python3.6/site-packages/selenium/webdriver/support/wait.py ",第 80 行,直到 raise TimeoutException(message, screen, stacktrace) TimeoutException
  • 嗯,ipython 问题。 xpath 怎么样?
  • XPATH 也一样
  • TimeoutExceptionfailed expected-conditions 的结果。通过find_element_by_*time.sleep() 一起调试您的代码。如果您能够找到该元素,请使用观察结果更新问题。
【解决方案2】:

我认为你的元素在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 秒,直到元素可以点击并且点击它。希望这会有所帮助。

【讨论】:

  • 感谢您的回答!到目前为止,它不起作用:a)对于 iframe 外部:WebDriverWait(driver, 60).until(EC.element_to_be_clickable((By.ID, "experiment-method-next"))).click() 给出文件“/anaconda3/lib/python3.6/site-packages/selenium/webdriver/support/wait.py”,第 80 行,直到引发 TimeoutException (消息、屏幕、堆栈跟踪)TimeoutException。
  • 对于 iframe,我试图找到在我最初输入的源代码之前找到的位置和内容是这个 ...
  • 能否提供网站链接?
  • 恐怕我做不到;它不公开。
  • 网站上还有其他 iframe 或框架吗?
【解决方案3】:

我找到的解决方案是首先杀死我的应用程序打开的任何以前的窗口并切换到最新的窗口:

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

现在,可以点击下一步按钮,如下所示: driver.find_element_by_id('experiment-method-next').click()

非常感谢用户 Andrei SuvorkovDebanjanB 的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-30
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多