Java Twitter中的Get.text()

Java Twitter中的Get.text(),java,selenium,Java,Selenium,我正在尝试获取twitter中登录错误消息的文本 Twitter此部分的HTML代码: <div class="message-inside"> <span class="message-text">The email or password doesn't match.</span> </div> 其中xpath是Mozilla的inspect元素给出的xpath。但是,字符串消息为空 PS:在调用getText时,消息没有隐藏,所

我正在尝试获取twitter中登录错误消息的文本

Twitter此部分的HTML代码:

<div class="message-inside">
    <span class="message-text">The email or password doesn't match.</span>
  </div>
其中xpath是Mozilla的inspect元素给出的xpath。但是,字符串消息为空

PS:在调用getText时,消息没有隐藏,所以我认为这不是问题所在


编辑:我还尝试了.getAttribute(“innerHTML”)而不是.getText(),这也失败了。

尝试将路径更改为div[1]或删除路径中的一个“/div”。

尝试将路径更改为div[1]或删除路径中的一个“/div”。

好的,因此显然在我尝试获取文本时错误消息被隐藏了。我告诉Selenium在获取文本之前(以及输入错误登录后)等待一段时间:


它能毫无困难地得到文本。如果您试图获取以前隐藏的文本,请告诉Selenium稍等,这样您就可以确保它不再隐藏。

好的,显然在我尝试获取文本时错误消息被隐藏了。我告诉Selenium在获取文本之前(以及输入错误登录后)等待一段时间:


而且它能够毫不费力地获得文本。如果您试图获取以前隐藏的文本,请告诉Selenium稍等片刻,以确保它不再隐藏。

永远不要解决睡眠问题:它不可靠(如果元素出现的时间比睡眠时间晚1毫秒怎么办?),会减慢测试速度(若元素在睡眠开始后10毫秒出现会怎样?你们浪费了990毫秒,在许多测试中它加起来了)

相反,请使用显式等待模式等待文本出现:

WebDriverWait wait = new WebDriverWait(driver, 10); // wait for max 10 sec
String message =  wait.until(ExpectedConditions. visibilityOfElementLocated(By.xpath("/html/body/div[2]/div/div/span")).getText();
通过这种方式,您可以告诉selenium最多等待元素10秒,但如果元素出现在之前,它将返回得更快

另一件事:xpath之类的
/html/body/div[2]/div/div/span
不是您通常应该使用的东西(有些情况下是不可避免的,但很少使用)。原因:

  • 首先,通过查看路径,您无法判断您选择的是什么。因此,如果HTML发生变化,您将很难弄清楚该语句以前做了什么
  • 按索引选择(例如,
    div[2]
    )是非常容易破坏的:只需在所选div的上方再出现一个div,xpath就会破坏
  • 你很少需要选择绝对路径。专注于重要的部分
例如,您正在尝试选择的内容在Twitter上如下所示:

 <div class="alert-messages" id="message-drawer" style="top: -40px;">
     <div class="message ">
         <div class="message-inside">
             <span class="message-text"></span>
         </div>
     </div>
 </div>

它告诉您正在查看页面的哪一部分-
消息抽屉
(而
id
最适合识别内容-它总是唯一的)。以及您对该部分中的哪个元素感兴趣。就是这样。如果页面上有任何更改,您基本上不会在意。即使更改了,xpath也会清楚地告诉您选择的目的,以便更容易理解它的含义。

永远不要解决睡眠问题:它不可靠(若元素出现的时间比睡眠时间晚1毫秒怎么办?)会减慢测试速度(若元素出现的时间比睡眠时间晚10毫秒怎么办?你们浪费了990毫秒,而且在许多测试中它加起来了)

相反,请使用显式等待模式等待文本出现:

WebDriverWait wait = new WebDriverWait(driver, 10); // wait for max 10 sec
String message =  wait.until(ExpectedConditions. visibilityOfElementLocated(By.xpath("/html/body/div[2]/div/div/span")).getText();
通过这种方式,您可以告诉selenium最多等待元素10秒,但如果元素出现在之前,它将返回得更快

另一件事:xpath之类的
/html/body/div[2]/div/div/span
不是您通常应该使用的东西(有些情况下是不可避免的,但很少使用)。原因:

  • 首先,通过查看路径,您无法判断您选择的是什么。因此,如果HTML发生变化,您将很难弄清楚该语句以前做了什么
  • 按索引选择(例如,
    div[2]
    )是非常容易破坏的:只需在所选div的上方再出现一个div,xpath就会破坏
  • 你很少需要选择绝对路径。专注于重要的部分
例如,您正在尝试选择的内容在Twitter上如下所示:

 <div class="alert-messages" id="message-drawer" style="top: -40px;">
     <div class="message ">
         <div class="message-inside">
             <span class="message-text"></span>
         </div>
     </div>
 </div>

它告诉您正在查看页面的哪一部分-
消息抽屉
(而
id
最适合识别内容-它总是唯一的)。以及您对该部分中的哪个元素感兴趣。就是这样。如果页面上有任何更改,您基本上不会在意。即使更改了,xpath也会清楚地告诉您选择的目的,以便更容易理解其含义。

我说只需更改路径,因为如果它没有检索文本,则可能无法获取正确的路径path.No deal.NoTouchElement异常。我还尝试使用cssSelector而不是xpath,但也失败了。因此,如果这是您要查找的字段的正确路径,那么我的下一个问题是……这是在尝试获取用户名或密码字段的文本吗?不,这是在您键入错误日志时尝试获取错误消息的文本在中。我无法保证这是正确的路径,但我已尝试使用不同的定位器。如果可以,获取错误消息文本的目的是什么?我说只需更改路径,因为如果它没有检索文本,则可能无法获得正确的路径。无交易。无接触元素异常。我还尝试使用cssSelector而不是xpath,xpath也失败了。因此,如果这是您要查找的字段的正确路径,那么我的下一个问题是……这是在尝试获取用户名或密码字段的文本吗?不,它是在您键入错误登录名时尝试获取错误消息的文本。我无法保证这是正确的路径,但我尝试使用了differ租用定位器。如果可以的话,获取错误消息文本的目的是什么?JavaScript!=Java。你是想将其标记为JavaScrip问题吗?@sofend我正在通过JUnitJavaScript!=Java在Java中运行Selenium测试。你是想将其标记为JavaScrip问题吗?@sofend我正在通过JUnitI do在Java中运行Selenium测试不
//div[@id='message-drawer']//span[@class='message-text']