Как создать уникальный сложный Xpath для поиска тега textarea? - PullRequest
0 голосов
/ 18 января 2020

В последнее время в моей работе возникает проблема с созданием правильного селектора Xpath для получения содержимого требуемой текстовой области. Вот структура моего HTML документа:

<div id="X115OutsideBorder" style="left: 59.1%; top: 855px; width: 14.6%; height: 22px; position: absolute;">
  <div class="CheckBox ltr mandatoryFieldStyle " id="X115Border">
    <div class="xEdit FormatInputReadonly" id="X115Edit">
      <div style="display: inline-block; direction: ltr;">
       <label disabled="" class="xCheckboxIcon" id="X115Icon" for="X115"></label>
       <input name="instance/CUST.risk.major.inc" tabindex="-32768" disabled="" 
        id="X115" onclick="handleOnClick(this, event);" 
        onfocus="handleOnFocus(this, event);" onblur="handleOnBlur(this, event); 
        applyToSameControl(this);" onchange="handleOnChange(this, event);" 
        type="checkbox" readonly="" value="true" datachangeevent="3034" dvdvar="" 
        buttonid="" sctype="CheckBox" ref="instance/CUST.risk.major.inc">
      </div>
    <span class="xCheckboxLabelSpan FormatLabel " id="X115LabelSpan">
      <label class="xCheckboxLabel" id="X115Label" for="X115" enabledstyle="&#10;    
       color:&#10;    #000000;&#10;  ">Risk to Major Incident?</label>
    </span>
   </div>
 </div>
</div>
<input id="X117" type="hidden" value="0" dvdvar="instance/CUST.interface.error">
<span class="Label" id="X119" style="left: 0%; top: 885px; width: 15.1%; height: 22px; text-align: right; position: absolute;" type="label">
   <label id="X120_Label" for="X120">Additional Information</label>
</span>
<div class="MultiText" id="X120Border" style="left: 16%; top: 885px; width: 71.5%; height: 187px; position: absolute;">
   <div class=" mandatoryFieldStyle xEdit xTextArea" id="X120Edit" style="height: 187px;">
     <textarea name="instance/Additional.information" tabindex="-32768" id="X120" 
     style="height: 185px;" onkeyup="&#10;    lockFormOnValueChange(this);&#10;  " 
     onclick="handleOnClick(this, event);" onfocus="handleOnFocus(this, event);" 
     onblur="handleOnBlur(this, event); applyToSameControl(this);" 
     onchange="handleOnChange(this, event);" rows="4" cols="81" 
     dvdvar="instance/Additional.information" buttonid="" sctype="MultiText"> 
     </textarea>
   </div>
</div>

Итак, я создал класс в Java с использованием инфраструктуры Selenium, выглядящий следующим образом:

        Thread.sleep(5000);
        WebDriverWait wait = new WebDriverWait(driver, 15);
        WebElement additionalInfoElement = wait.until
(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='sm-clpsSectionCnt ie cntExpanded']
//div[@class='MultiText']//div[@class=' mandatoryFieldStyle xEdit xTextArea'] //textarea[contains(@id,'X120')]")));
        driver.findElement(By.xpath("//div[@class='sm-clpsSectionCnt ie cntExpanded'] //div[@class='MultiText']//div[@class=' mandatoryFieldStyle xEdit xTextArea']
//textarea[contains(@id, 'X120')]"));
        Thread.sleep(3000);
        additionalInfoElement.click();
        String additionalInfoContent = additionalInfoElement.getText();
        driver.switchTo().defaultContent();

        Map<String, String> assigneesToKeywords = new HashMap<>();
        assigneesToKeywords.put("ee57977","Please select the affected Process / Application::SSR");
        assigneesToKeywords.put("c308042","Please select the affected Process / Application::SSR1");
        assigneesToKeywords.put("p853780","Please select the affected Process / Application::MMSR");
        assigneesToKeywords.put("c323607","Please select the affected Process / Application::Reporting");
        assigneesToKeywords.put("c152236","Please select the affected Process / Application::BOI");
        assigneesToKeywords.put("ex73629","K3, K4");
        assigneesToKeywords.put("C321274","Please select the affected Process / Application::CPR");
        assigneesToKeywords.put("X","Please select the affected Process / Application::FOBO");
        assigneesToKeywords.put("c325285","Please select the affected Process / Application::T-RECS");

        for (Map.Entry<String,String> entry : assigneesToKeywords.entrySet()){
            if (entry.getValue().contains(additionalInfoContent)){
                chosenAssignee=entry.getKey();
            }else
                chosenAssignee="XXXX";
        }

        return chosenAssignee;
    }

Что я пытаюсь сделать прямо сейчас, это получить содержимое текстовой области с именем «Дополнительная информация» и сравнить его со значениями карты «assigneesToKeywords». Однако созданный мной Xpath не работает, и у меня не осталось идей, как это исправить ... Я все еще получаю следующую ошибку: "Ожидаемое условие не выполнено: ожидание видимости элемента, расположенного в By.xpath:. .. "

До сих пор я пытался увеличить время ожидания, но оно не сработало. Я думаю, все дело в правильной конструкции Xpath.

Есть идеи, что я делаю неправильно? Заранее большое спасибо, ребята!

С уважением, Матеуш.

1 Ответ

0 голосов
/ 20 января 2020

Насколько я понимаю, вы пытаетесь найти текстовое поле с надписью Дополнительная информация. Этот элемент метки имеет атрибут @for, который является атрибутом @id элемента textarea.

<label id="X120_Label" for="X120">Additional Information</label>
<textarea name="instance/Additional.information" tabindex="-32768" id="X120" ...</textarea>

Попробуйте это:

WebElement additionalInfoElement = driver.findElement(By.xpath("//textarea[@id=//label[text()='Additional Information']/@for]"));
String additionalInfoContent = additionalInfoElement.getText();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...