硒无法找到实际存在的元素

时间:2019-07-15 21:38:18

标签: python selenium

我正在自动执行无聊的数据输入任务,因此我创建了一个程序,该程序基本上可以使用硒为我点击和键入。运行的很好!除了到达我需要单击的此特定“编辑详细信息...”元素时,Selenium无法找到该元素,无论我尝试哪种方法。

我尝试使用CSS选择器,该选择器尝试访问ID无济于事。我还尝试使用XPATH,并尝试通过提供带有按钮文本的“包含”语句来使其更加具体。作为最后的选择,我使用selenium IDE来查看当我物理地单击按钮时它注册了什么定位器,并且它使用了我在代码中声明的完全相同的ID。我完全不知道如何解决此问题。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import *

import pyautogui as py
import time, sys, os, traceback


#Launching Browser
browser = webdriver.Ie()
wait = WebDriverWait(browser, 15) #Waiting


#Laziness Functions
def clickCheck(Method, Locator, elemName):
    wait.until(EC.element_to_be_clickable((Method, Locator)))
    print(elemName + ' Clickable')




#Commence main function
try:

    #Do alot of Clicks and Stuff until it reaches "Edit Details..." element

    """THIS IS WHERE THE PROBLEM LIES"""
    time.sleep(3)
    clickCheck(By.CSS_SELECTOR, 'td[id="DSCEditObjectSummary"]', "Edit Details")
    elemEdit = browser.find_element_by_css_selector('td[id="DSCEditObjectSummary"]')
    elemEdit.click()




#FAILSAFES

except:
    print('Unknown error has Occured')
    exc_info = sys.exc_info()
    traceback.print_exception(*exc_info)
    del exc_info

finally: #Executes at the end and closes all processes
    print('Ending Program')
    browser.quit()
    os.system("taskkill /f /im IEDriverServer.exe")
    sys.exit()

raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: Unable to find element with css selector == [id="DSCEditObjectSummary"] 

这是我得到的错误,我想要的就是单击元素,就像所有其他元素都被CSS_Selectors定位一样。下图以蓝色指示“编辑详细信息...”按钮的确切行。

Edit Details Button

2 个答案:

答案 0 :(得分:0)

看起来问题可能出在页面加载缓慢,或者另一位评论者提到它在iFrame中,等等。如果您正在运行此工具,我通常会尝试使用X / Y坐标和AppRobotic等宏工具进行点击在Windows上。如果是页面加载缓慢的问题,我通常会尝试停止页面加载,并与页面进行一些交互,这样的方法应该对您有用:

    this.loadImages(lesObs[i].imagePath).then( async (blobList) => {
        lesObs[i].imageBlobs = blobList;
        this.http.post(this.url_post_one_observation, lesObs[i], { headers: this.headers })
        .subscribe(
        (result) => {
            console.log("upload done");
        }, (error) => {
            this.showErrorAlert("Erreur upload : " + error.status, error.message);
        });
    });


  private async loadImages(paths: string[]) {
    let lesBlobs :string[];
    paths.forEach(async (unPath) => {
      let img = await this.encodeImage(unPath);
      console.log ("img :" + img );
      lesBlobs.push(img);
    });
    console.log("returning les blobs");
    return lesBlobs;
  }

  private async encodeImage(path) {
    return this.base64.encodeFile(path).then((img) => {
      console.log("encoding " + path);
      return img;
    });
  }

答案 1 :(得分:0)

对于其他可能遇到相同问题并偶然发现此帖子的人,我会更多地发布此答案。正如@PeterBejan提到的那样,我尝试单击的元素嵌套在iframe中。除了抛出NoSuchFrameException外,我尝试访问iframe。进一步的挖掘表明,该框架嵌套在其他3个框架内,我必须从上到下切换到每个框架以访问该元素。这是我使用的代码

wait.until(EC.frame_to_be_available_and_switch_to_it("TopLevelFrameName"))
wait.until(EC.frame_to_be_available_and_switch_to_it("SecondaryFrameName"))
wait.until(EC.frame_to_be_available_and_switch_to_it("TertiaryFrameName"))
wait.until(EC.frame_to_be_available_and_switch_to_it("FinalFrameName"))
clickCheck(By.ID, 'ElementID', "Edit Details")
elemEdit = browser.find_element_by_id("ElementID")
elemEdit.click()