【问题标题】:Python Selenium, help me locate an element in a websitePython Selenium,帮我定位网站中的元素
【发布时间】:2020-11-16 17:23:38
【问题描述】:

我想在 python 中使用 selenium 模块点击 mt4 web terminal 中的“新订单”图标

这是代码:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome('./chromedriver')
driver.get("https://www.mql5.com/en/trading")
new_order = driver.find_element_by_xpath('/html/body/div[3]/div[1]/a[1]/span[1]')
new_order.click()

这是我得到的错误:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/div[3]/div[1]/a[1]/span[1]"}
(Session info: chrome=86.0.4240.198)

找到该按钮的正确方法是什么,我搜索并找到了一些定位硒元素的方法,但我无法让它们中的任何一个对我有用。

【问题讨论】:

    标签: python python-3.x selenium


    【解决方案1】:

    看起来您的网页正在处理 iframe。因此,虽然above answer 有很好的做法,但您还需要切换到 iframe:

    driver.switch_to.iframe(self,frame reference)
    

    https://www.techbeamers.com/switch-between-iframes-selenium-python/https://stackoverflow.com/a/24286392/1387701 查找更多详细信息

    【讨论】:

      【解决方案2】:

      工具提示为 New Order 的元素在 <iframe> 内,因此您必须:

      • 诱导WebDriverWait 使所需的帧可用并切换到它

      • 诱导WebDriverWait 使所需的元素可点击

      • 您可以使用以下基于Locator Strategies

        driver.get('https://www.mql5.com/en/trading')
        WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id='webTerminalHost']")))
        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[text()='Connect to an Account']//following-sibling::div[1]/span"))).click()
        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@title='New Order']/span"))).click()
        
      • 注意:您必须添加以下导入:

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

      【讨论】:

      • 我复制了代码,没有错误,但是新的订单窗口打不开。我在最后一行之前添加了“time.sleep(10)”,然后它就起作用了。也非常感谢“定位器策略”链接。
      • 您能帮我解释一下第 3 行吗? ...连接到帐户...
      • @ErfanMonemi //div[text()='Connect to an Account']//following-sibling::div[1]/span 在这里我们正在寻找一个 <div> 节点,其中包含文本 连接到帐户,然后移动到它的以下兄弟姐妹并识别第一个 @ 987654330@ 和 <div> 向它的孩子更深一步 <span>.
      • 对不起,我又问了另一个问题,但是我如何在新的订单窗口中从符号下拉菜单中选择一个选项?我写了这段代码: def fast_multiselect(driver, element_id, labels): select = Select(driver.find_element_by_id(element_id)) for label in labels: select.select_by_visible_text(label) fast_multiselect(driver, 'symbol', "USDCAD") 和收到此错误:消息:选择仅适用于
      【解决方案3】:

      您可以使用不同的 xpath:

      new_order = driver.find_element_by_xpath('//a[@title="New Order"]')
      

      但我建议 By、WebDriverWait 和 expected_conditions:

      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 as EC
      from selenium.webdriver.common.keys import Keys
      import time
      driver = webdriver.Chrome('./chromedriver')
      driver.get("https://www.mql5.com/en/trading")
      time.sleep(5)
      iframe = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//iframe[@id="webTerminalHost"]')))
      driver.switch_to.frame(iframe)
      new_order = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//a[@title="New Order"]')))
      new_order.click()
      

      【讨论】:

      • 非常感谢。我输入了您建议的代码并收到此错误:...TimeoutException... 然后我将值 10 更改为 40(我不确定那是什么)和得到同样的错误。我写了另一个代码: from selenium import webdriver driver = webdriver.Chrome('./chromedriver') driver.get("mql5.com/en/trading") result = False while result == False: try: new_order = driver.find_element_by_xpath('// a[@title="New Order"]') new_order.click() result = True 例外为 e: print(e) print("done") 我明白了: ....没有这样的元素... .
      • 10 是页面将等待的秒数。增加等待时间(就像你做的那样)
      • @Erfan Monemi 有一个 iframe,但也有一个弹出窗口会导致 ElementClickInterceptedException 在几秒钟后消失。查看更新的答案。
      • 非常感谢您的更新,我复制了更新后的代码,没有错误,但是新订单窗口打不开。我在最后一行之前添加了“time.sleep(5)”,然后它就起作用了。非常感谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-14
      • 1970-01-01
      • 2017-11-27
      • 2017-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多