在刮取d时,Selenium错误“Element is not attached to the DOM”

2024-06-17 07:47:14 发布

您现在位置:Python中文网/ 问答频道 /正文

        for i in driver.find_elements_by_class_name("endorse-count"):
            try:
                i.click()
            except:
                continue

            elem = WebDriverWait(driver, 100).until(EC.presence_of_element_located((By.CLASS_NAME, "dialog-window")))
            src = elem.get_attribute("innerHTML")

            add_skill(name, src)

            WebDriverWait(driver, timeout=10)

我在运行上述代码时遇到以下错误-

^{pr2}$

对于线路-

src = elem.get_attribute("innerHTML")

我正在LinkedIn用户配置文件页面上运行此代码,登录后。在

我尝试在“I.click()”之后添加以下代码行-

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

但是我看到函数“add_skill(name,src)”没有被调用,后面的代码也没有司机.管理调用了(),但for loop和further i.click()可以正常工作。在


Tags: 代码nameinsrcaddforgetdriver
3条回答

我在尝试执行一些javascript(IJavaScripExecutor)时遇到了类似的问题。我创建了一个IWebElement并将其传递给JSE,但这对我来说失败了。当我移动驱动程序.FindElement(选举人)进入我的JSE电话,然后就成功了。(C#提前编码。)

而不是:

IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
IWebElement tableEl = driver.FindElement(selector);
js.ExecuteScript(script, tableEl);

我不得不这样做:

^{pr2}$

您可能需要做一些类似的事情:将选择器或元素创建移动到与您尝试的操作相同的行上。或者,对你来说:

src = driver.find_element_by_class_name("dialog-window").get_attribute("innerHTML")

仔细观察,这就是您的问题所在,当您尝试使用get_attribute方法时,会出现一个过时的web元素对象。在

我也遇到过类似的问题,在找到元素之前尝试刷新页面,结果成功了。。。在

driver.navigate().refresh();

虽然我无法解释这是怎么回事。在

如果这对你也有用,请告诉我。我只想进一步了解这个例外情况。在

you can refer this page to learn about a similar issue

Selenium正在尝试在验证目标元素是否已在页面上呈现之前完成操作(例如单击按钮或链接)。Selenium可以更有耐心,但你必须明确要求他这样做。在

例如,如果您正在测试一个发出AJAX请求的东西,您可以尝试如下方法(在Ruby中):

# timeout is in seconds
def wait_for_ajax(timeout=x)
 time_limit, interval = (Time.now + timeout), 0.5
 loop do
   break if @driver.execute_script "return jQuery.active == 0"
   sleep interval
   raise "Wait for AJAX timed out after waiting for #{timeout} seconds" if Time.now > time_limit
 end
end

为了确保您的测试是完全全面的,总是让Selenium在运行任务之前等待元素加载。在

相关问题 更多 >