nosuchelementexception,selenium无法定位元素

pkln4tw6  于 2021-07-06  发布在  Java
关注(0)|答案(3)|浏览(525)

我想在selenium中找到我的textfield,但我不知道如何找到(我第一次使用sellenium)。
我试过:

driver.findElement(By.id("originTextField"))

或者由chrome在dev工具中生成的xpath和cssselector字符串。
请帮帮我,我很感激你的解释。
这是html:

u3r8eeie

u3r8eeie1#

无接触异常

org.openqa.selenium.nosuchelementexception俗称nosuchelementexception,它扩展了org.openqa.selenium.notfoundexception,这是webdriverexception的一种类型。
nosuchelementexception可以在以下两种情况下抛出:
使用时 WebDriver.findElement(By by) :

//example : WebElement my_element = driver.findElement(By.xpath("//my_xpath"));

使用时 WebElement.findElement(By by) :

//example : WebElement my_element = element.findElement(By.xpath("//my_xpath"));

根据javadocs,就像其他webdriverexception一样,nosuchelementexception应该包含以下常量字段:

Constant Field      Type                                        Value
SESSION_ID          public static final java.lang.String        "Session ID"
e.g. (Session info: chrome=63.0.3239.108)

DRIVER_INFO         public static final java.lang.String        "Driver info"
e.g. (Driver info: chromedriver=2.34.522940 (1a76f96f66e3ca7b8e57d503b4dd3bccfba87af1),platform=Windows NT 6.1.7601 SP1 x86)

BASE_SUPPORT_URL    protected static final java.lang.String     "http://seleniumhq.org/exceptions/"
e.g. (For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html)

原因

nosuchelementexception的原因可以是以下任一原因:
您采用的定位器策略不会标识HTMLDOM中的任何元素。
您采用的定位器策略无法识别元素,因为它不在浏览器的视口中。
您采用的定位器策略标识元素,但由于存在属性style=“display:none;”,因此不可见。
您所采用的定位器策略不能唯一地标识HTMLDOM中所需的元素,并且当前会查找其他隐藏/不可见的元素。
您尝试查找的Web元素位于 <iframe> 标签。
webdriver示例甚至在元素在htmldom中出现/可见之前就开始查找webelement。

解决方案

解决nosuchelementexception的解决方案可以是以下任一种:
采用一种定位策略,唯一地标识所需的webelement。您可以借助开发人员工具(ctrl+shift+i或f12)并使用elementinspector。
在这里你会发现一个详细的讨论,如何检查元素 selenium 化 selenium 3.6作为萤火虫不再是一个选项ff 56?
使用 executeScript() 方法将元素滚动到视图中,如下所示:

WebElement elem = driver.findElement(By.xpath("element_xpath"));
((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView();", elem);

在这里,您将看到关于使用selenium在python中滚动到页面顶部的详细讨论
如果元素具有属性style=“display:none;”,通过删除属性 executeScript() 方法如下:

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

检查元素是否在 <iframe> 遍历html以找到相应的 <iframe> 标记和 switchTo() 通过以下方法之一创建所需的iframe:

driver.switchTo().frame("frame_name");
driver.switchTo().frame("frame_id");
driver.switchTo().frame(1); // 1 represents frame index

在这里,您可以找到一个关于在SeleniumWebDriverJava?中不使用driver.switchto().frame(“framename”)就可以切换到框架中的元素的详细讨论?。
如果该元素在html dom中不存在/不可见,请使用expectedconditions将webdriverwait设置为正确的方法,如下所示:
要等待元素的出现,请执行以下操作:

new WebDriverWait(driver, 20).until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[@class='buttonStyle']//input[@id='originTextField']")));

要等待找到的元素的可见性,请执行以下操作:

new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='buttonStyle']//input[@id='originTextField']")));

要等待元素可选择,请执行以下操作:

new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@class='buttonStyle']//input[@id='originTextField']")));

参考

有关selenium基于python客户端的相关讨论,请参见:
selenium使用chrome时“selenium.common.exceptions.nosuchelementexception”

gr8qqesn

gr8qqesn2#

下面的代码将帮助您解决它

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

或者

wait = new WebDriverWait(driver, 90);
wait.until(ExpectedConditions.visibilityOf(element)).wait(20);
qc6wkl3g

qc6wkl3g3#

你的代码是正确的,我怀疑这个问题造成的网页没有完成加载时,你找到的元素。
试着在找元素之前加一个长睡眠,如果加睡眠起作用,就改睡眠等待。
下面是代码,如果元素不存在,则表示等待10秒:

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "originTextField"))
)

相关问题