NoTouchElementException,Selenium无法定位元素

NoTouchElementException,Selenium无法定位元素,selenium,selenium-webdriver,css-selectors,webdriver,selenium-chromedriver,python,Selenium,Selenium Webdriver,Css Selectors,Webdriver,Selenium Chromedriver,Python,我想在selenium中找到我的文本字段,但我不知道如何找到(我第一次使用sellenium) 我试过: driver.findElement(By.id("originTextField")) 或者通过开发工具中chrome生成的xPath和cssSelector字符串 请帮帮我,我将感谢您的解释。 这是html: 您的代码是正确的,我怀疑该问题是您找到元素时页面未完成加载的原因 尝试在查找元素之前添加长时间睡眠,如果添加睡眠有效,请将睡眠更改为等待 这是代码,表示如果元素不存在,则等待1

我想在selenium中找到我的文本字段,但我不知道如何找到(我第一次使用sellenium)

我试过:

 driver.findElement(By.id("originTextField"))
或者通过开发工具中chrome生成的xPath和cssSelector字符串

请帮帮我,我将感谢您的解释。

这是html:


您的代码是正确的,我怀疑该问题是您找到元素时页面未完成加载的原因

尝试在查找元素之前添加长时间睡眠,如果添加睡眠有效,请将睡眠更改为等待

这是代码,表示如果元素不存在,则等待10秒:

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "originTextField"))
)
非接触性异常 通常被称为NoTouchElementException扩展,它是一种

在以下两种情况下可以抛出NoTouchElementException:

WebElement elem = driver.findElement(By.xpath("element_xpath"));
((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView();", elem);
WebElement element = driver.findElement(By.xpath("element_xpath"));
((JavascriptExecutor)driver).executeScript("arguments[0].removeAttribute('style')", element)
element.sendKeys("text_to_send");
  • 使用
    WebDriver.findElement(By)
    时:

  • 使用
    WebElement.findElement(By)
    时:

根据JavaDocs,与其他WebDriverException一样,NoTouchElementException应该包含以下常量字段:


理由 NoTouchElementException的原因可能是以下任一原因:

  • 您所采用的定位器策略不会标识中的任何元素
  • 您采用的定位器策略无法识别该元素,因为它不在浏览器的位置范围内
  • 您采用的定位器策略标识元素,但由于存在属性style=“display:none;”,因此不可见
  • 您采用的定位器策略不会唯一地标识HTML DOM中所需的元素,并且当前会找到其他隐藏/不可见的元素
  • 您试图查找的WebElement位于
    标记内
  • WebDriver实例甚至在WebElement在HTMLDOM中出现/可见之前就在寻找WebElement

解决方案 解决NoTouchElementException的解决方案可以是以下任一种:

  • 采用唯一标识所需WebElement的。您可以借助开发人员工具(Ctrl+Shift+I或F12)并使用元素检查器

    在这里,您将看到有关的详细讨论

  • 使用方法滚动元素以查看,如下所示:

    WebElement elem = driver.findElement(By.xpath("element_xpath"));
    ((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView();", elem);
    
    WebElement element = driver.findElement(By.xpath("element_xpath"));
    ((JavascriptExecutor)driver).executeScript("arguments[0].removeAttribute('style')", element)
    element.sendKeys("text_to_send");
    
    在这里,您将看到有关的详细讨论

  • 如果元素具有属性style=“display:none;”,请通过
    executeScript()
    方法删除该属性,如下所示:

    WebElement elem = driver.findElement(By.xpath("element_xpath"));
    ((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView();", elem);
    
    WebElement element = driver.findElement(By.xpath("element_xpath"));
    ((JavascriptExecutor)driver).executeScript("arguments[0].removeAttribute('style')", element)
    element.sendKeys("text_to_send");
    
  • 要检查元素是否在
    中,请通过以下任一方法向上遍历HTML以找到相应的
    标记和
    切换到()
    所需的iframe:

    driver.switchTo().frame("frame_name");
    driver.switchTo().frame("frame_id");
    driver.switchTo().frame(1); // 1 represents frame index
    
    在这里,您可以找到有关的详细讨论

  • 如果元素在HTML DOM中不存在/不可见,请按如下所示将其设置为适当的方法:

    WebElement elem = driver.findElement(By.xpath("element_xpath"));
    ((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView();", elem);
    
    WebElement element = driver.findElement(By.xpath("element_xpath"));
    ((JavascriptExecutor)driver).executeScript("arguments[0].removeAttribute('style')", element)
    element.sendKeys("text_to_send");
    
    • 等待:

    • 等待:

    • 等待:


参考文献 您可以在以下位置找到基于客户的相关讨论:


    • 下面的代码将帮助您解决此问题

      wait = new WebDriverWait(driver, 60);
      wait.until(ExpectedConditions.presenceOfElementLocated(By.id("originTextField")));
      


      谢谢你的回答,你能为
      executeScript()
      方法提供python的等价物吗?非常感谢。或者你可以把
      sleep(1000)
      然后
      driver.findElement(By.id(“originTextField”))
      wait = new WebDriverWait(driver, 90);
      wait.until(ExpectedConditions.visibilityOf(element)).wait(20);