NoTouchElementException,Selenium无法定位元素
我想在selenium中找到我的文本字段,但我不知道如何找到(我第一次使用sellenium) 我试过: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
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)
理由 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);