我正在自动执行无聊的数据输入任务,因此我创建了一个程序,该程序基本上可以使用硒为我点击和键入。运行的很好!除了到达我需要单击的此特定“编辑详细信息...”元素时,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定位一样。下图以蓝色指示“编辑详细信息...”按钮的确切行。
答案 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()