Используя C # и Selenium, как выбрать элемент SubMenu, который является наведенной ссылкой в IE?

0

Я несколько раз искал несколько тем в Qaru и других сайтах, пытаясь найти решение для этого без везения. У меня есть веб-сайт, который я пытаюсь автоматизировать с помощью С# Selenium и не могу заставить Webdriver щелкнуть ссылку на этот пункт подменю. Как вы используете XPath или другое решение для клика по этому элементу подменю?

Сначала нужно щелкнуть по заголовку меню, чтобы отобразить остальную часть списка меню, затем нажмите один из параметров в подменю, чтобы перейти на страницу. Я пытаюсь щелкнуть по "Ad Hoc POCNs", чтобы отобразить список элементов подменю, который отлично работает с помощью Webdriver Click(), но затем нажатие на элемент подменю, например "Создать POCN по номеру заказа/номеру товара", не работает.

Вот HTML:

    <div id="WUC_Menu1_divMenu" style="WIDTH: 780px;height: 18px;">
<GDC:Menu userType="B" type="main" hilitecolor="white" hilitebgcolor="black" normalcolor="White" normalbgcolor="#713400" normalendbgcolor="Black" noframes="yes" xmlns:GDC="company website taken out">
    <GDC:Menu type="horz" caption="Requisitions" href="" value="" normalbgcolor="#B58759">
        <GDC:Menu useView="true" type="vert" caption="Create New Req" href="EditReq.aspx"/>
        <GDC:Menu useView="true" type="vert" caption="Unreleased Reqs" href="ListReqs.aspx?type=P&amp;status=U&amp;StartPage=N" mtype="P" status="U"/>
        <GDC:Menu useView="true" type="vert" caption="Reqs Awaiting Auto Conversion" href="ListReqs.aspx?type=P&amp;status=A&amp;StartPage=N" mtype="P" status="A"/>
        <GDC:Menu useView="true" type="vert" caption="Reqs Awaiting Other Approval" href="ListReqsAwaitingOtherApproval.aspx?type=P&amp;status=I&amp;StartPage=N" mtype="P" status="I"/>
        <GDC:Menu useView="true" type="vert" caption="Rejected Reqs" href="ListReqs.aspx?type=P&amp;status=R" mtype="P" status="R"/>
        <GDC:Menu useView="true" type="vert" caption="Cancelled Reqs" href="ListReqs.aspx?type=P&amp;status=C" mtype="P" status="C"/>
        <GDC:Menu useView="true" type="vert" caption="Converted Reqs" href="ListReqs.aspx?type=P&amp;status=P" mtype="P" status="P"/>
        <GDC:Menu useView="true" type="vert" caption="Copy Latest Req" href="CopyLatestReq.aspx"/>
        <GDC:Menu useView="true" type="vert" caption="Replicate Req" href="ReplicateReq.aspx"/>
    </GDC:Menu>
    <GDC:Menu type="horz" caption="Ad Hoc POCNs" href="" value="" normalbgcolor="#B58759">
        <GDC:Menu useView="true" type="vert" caption="Create POCN by PO Number/Part Number" href="ListOpenPOs.aspx?CREATE=Y&amp;POCN=Y"/>
        <GDC:Menu useView="true" type="vert" caption="Create New POCN" href="ListOpenPOs.aspx?POCN=Y"/>
        <GDC:Menu useView="true" type="vert" caption="Unreleased POCNs" href="ListReqs.aspx?type=C&amp;status=U&amp;StartPage=N" mtype="C" status="U"/>
        <GDC:Menu useView="true" type="vert" caption="POCNs Awaiting Auto Conversion" href="ListReqs.aspx?type=C&amp;status=A&amp;StartPage=N" mtype="C" status="A"/>
        <GDC:Menu useView="true" type="vert" caption="POCNs Awaiting Other Approval" href="ListReqsAwaitingOtherApproval.aspx?type=C&amp;status=I&amp;StartPage=N" mtype="C" status="I"/>
        <GDC:Menu useView="true" type="vert" caption="Rejected POCNs" href="ListReqs.aspx?type=C&amp;status=R" mtype="C" status="R"/>
        <GDC:Menu useView="true" type="vert" caption="Cancelled POCNs" href="ListReqs.aspx?type=C&amp;status=C" mtype="C" status="C"/>
        <GDC:Menu useView="true" type="vert" caption="Converted POCNs" href="ListReqs.aspx?type=C&amp;status=P" mtype="C" status="P"/>
    </GDC:Menu>
    <GDC:Menu type="horz" caption="AutoGen POCNs" href="" value="" normalbgcolor="#B58759">
        <GDC:Menu useView="true" type="vert" caption="POCNs Awaiting Approver Selection" href="ListReqs.aspx?type=S&amp;status=S&amp;StartPage=N" mtype="C" status="S"/>
        <GDC:Menu useView="true" type="vert" caption="POCNs Awaiting Auto Conversion" href="ListReqs.aspx?type=S&amp;status=H&amp;StartPage=N" mtype="C" status="H"/>
        <GDC:Menu useView="true" type="vert" caption="POCNs Awaiting Other Approval" href="ListReqsAwaitingOtherApproval.aspx?type=S&amp;status=SI&amp;StartPage=N" mtype="C" status="SI"/>
        <GDC:Menu useView="true" type="vert" caption="Rejected POCNs" href="ListReqs.aspx?type=S&amp;status=SR" mtype="C" status="SR"/>
        <GDC:Menu useView="true" type="vert" caption="Cancelled POCNs" href="ListReqs.aspx?type=S&amp;status=SC" mtype="C" status="SC"/>
        <GDC:Menu useView="true" type="vert" caption="Converted POCNs" href="ListReqs.aspx?type=S&amp;status=SP" mtype="C" status="SP"/>
        <GDC:Menu useView="true" type="vert" caption="ByPass AutoGen" href="ByPassAutoGenPOCN.aspx"/>
        <GDC:Menu useView="true" type="vert" caption="AUTO POCN Process Errors" href="ListAutoGenPOCNProcessErrors.aspx" mtype="S" status="AUTO"/>
    </GDC:Menu>
</GDC:Menu>
    </div>

Вот мой код:

//Click on the Ad Hoc POCNs to get the menu to appear and show sub menu options -- this works
driver.FindElement(By.XPath("//*[text()='Ad Hoc POCNs']")).Click();

//I am trying to click on Create POCN by PO Number/Part - this does not work
driver.FindElement(By.XPath("//*[text()='Create POCN by PO Number/Part Number']")).Click();

Я также пробовал

driver.FindElement(By.CssSelector("[href*='ListOpenPOs.aspx?CREATE=Y&amp;POCN=Y']")).Click();

driver.FindElement(By.Name...
driver.FindElement(By.Link...
driver.FindElement(By.TagName...
driver.FindElement(By.ID...
driver.FindElement(By.ClassName...

Первый щелчок работает отлично. Второй клик не работает. Я пробовал XPath и ряд других OpenQA.Selenium.By. __ щелкнуть по этой ссылке подменю и ничего не работает. Я получаю сообщение об ошибке "OpenQA.Selenium.Support.UI.UnexpectedTagNameException: Элемент должен был быть выбран, но был меню" при попытке использования SelectElement.

Этот HTML не имеет стандартных якорей и вместо этого имеет теги GDC: Menu.

Я думал, что XPath для поиска элементов в XML или XLST, но я вижу, где другие инженеры используют XPath для поиска HTML-элементов.

Я также пробовал действия, но, возможно, я не правильно понял свой код.

Также, возможно, у меня просто нет правильного выражения XPath, чтобы перейти к элементу подменю.

Пожалуйста, помогите мне найти решение по xpath или какое-то другое решение.

  • 0
    @sircapsalot, который представляет собой HTML в браузере IE. Это, конечно, не весь результат HTML. Я использовал инструмент разработчиков IE, и они говорят: «Инструменты F12 отображают HTML и CSS-код в том виде, в котором он отображается в браузере, а не в строгом исходном HTML-коде».
  • 0
    Когда я использую Firebug для проверки визуализированного HTML, здесь отображается xPath, который я получаю к элементу, который пытаюсь щелкнуть (): / html / body / form / div [2] / gdc: menu / gdc: menu / gdc: menu / GDC: меню / GDC: меню / GDC: меню / GDC: меню / GDC: меню / GDC: меню / GDC: меню / GDC: меню / GDC: меню / GDC: меню / GDC: меню / GDC: меню [2] / GDC: меню / GDC: меню / GDC: меню / GDC: меню / GDC: меню / GDC: меню / GDC: меню / GDC: меню / GDC: меню [2] / GDC: меню
Показать ещё 6 комментариев
Теги:
xpath
selenium
menu

2 ответа

0

Я тоже пробовал этот, но безрезультатно. Driver.FindElement(By.XPath("//div [@id = 'WUC_Menu1_divMenu']//gdc: menu/gdc: menu [contains (@caption, ' Создать POCN '] ")). Click();' Я получаю сообщение об ошибке, которое говорит:" OpenQA.Selenium.InvalidSelectorException: выражение xpath "//div [@id = 'WUC_Menu1_divMenu']//gdc: menu/gdc: menu [содержит (@caption, 'Create POCN'] 'не может быть оценен или не выполняется в WebElement "

Вы не можете использовать XPath для того, чтобы делать то, что вы пытаетесь сделать, оно не будет оценивать что-либо когда-либо, потому что вы говорите селену, чтобы смотреть на каждый элемент сразу. Вы можете использовать цикл for для его оценки или foreach.

//Get the number of items that exist in the menu drop down. 
int elements = driver.FindElements(By.XPath(".//*[@id'WUC_Menu1_divMenu']/gdc:menu/gdc:menu[2]")).Count(); 
for(int i = 1; i <= elements; i++) 
{
    //Get the caption value using .GetAttribute 
    string caption = driver.FindElement(By.XPath("//*[@id'WUC_Menu1_divMenu']/gdc:menu/gdc:menu[2]/gdc:menu[" + i + "]")).GetAttribute("caption");

    //An alternative to using the exact string would be 
    //if(caption.Contains("Create POCN"))

    if(caption == "Create POCN by PO Number/Part Number"))
    (
        driver.FindElement(By.XPath(".//*[@id='WUC_Menu1_divMenu']/gdc:menu/gdc:menu[2]/gdc:menu[" + i + "]")).Click();
    )
)

Другим вариантом было бы бросить некоторый Javascript, чтобы заставить элементы отображаться, а затем они могут взаимодействовать с селеной стороной. Я согласен с Дейвом, хотя лучше всего использовать конструктор действий. Вы можете посмотреть, как правильно организовать события.

  • 0
    Спасибо Бен за помощь! Извините, что это тоже не работает. Я даже сначала попробовал щелкнуть () в главном меню. Я еще не пробовал IJavaScriptExecutor на этом. Я не знаю, какой это будет сценарий. Я вижу несколько сценариев на этой странице. Я должен был бы отправить вам по электронной почте весь HTML или вставить здесь. Будет ли общедоступным вставлять весь HTML-код, поскольку это внутреннее веб-приложение?
  • 0
    Я не думаю, что нам нужны ВСЕ HTML и javascript, но нам нужно достаточно, чтобы проблема могла быть воспроизведена. Можете ли вы положить образец на jsfiddle.net
Показать ещё 5 комментариев
0

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

Возможно, вам нужно только подождать. Следующее предполагает, что ваши селекторы работают, но ваш элемент не стал видимым до того, как вы попытаетесь щелкнуть его. Это устранит эту проблему.

var wait = new WebDriverWait(driver, new TimeSpan(0,0,60); // wait 60 seconds
//Click on the Ad Hoc POCNs to get the menu 
//to appear and show sub menu options -- this works
driver.FindElement(By.XPath("//*[text()='Ad Hoc POCNs']"));

wait.Until(x => 
    x.FindElements(
        By.XPath("//*[text()='Create POCN by PO Number/Part Number']"))
        .Count > 0)


//I am trying to click on Create POCN by PO Number/Part - this does not work
driver.FindElement(
    By.XPath("//*[text()='Create POCN by PO Number/Part Number']"))
        .Click();

Если это не сработает, вам, вероятно, придется использовать Actions. Опять же, предполагая, что ваш селектор прав (и я не вижу никакой причины, это не так. Первый работает, второй должен также).

var wait = new WebDriverWait(driver, new TimeSpan(0,0,60); // wait 60 seconds
//Click on the Ad Hoc POCNs to get the menu 
//to appear and show sub menu options -- this works
var topElement = driver.FindElement(By.XPath("//*[text()='Ad Hoc POCNs']"));

// just to be sure
wait.Until(x => 
    x.FindElements(
        By.XPath("//*[text()='Create POCN by PO Number/Part Number']"))
        .Count > 0)


//I am trying to click on Create POCN by PO Number/Part - this does not work
var secondElement = driver.FindElement(
    By.XPath("//*[text()='Create POCN by PO Number/Part Number']"));
var action = new Actions(driver);
action.MoveToElement(secondElement).Click().Build().Perform();

Если ни один из тех не делает трюк, возможно, вы могли бы сделать образец доступным, чтобы я мог заставить его работать здесь и опубликовать код.

  • 0
    Большое спасибо Дейву за помощь. Это все еще не находит Создать POCN. Это время ожидания каждый раз. Кстати, не уверен, имеет ли это значение, но обе эти ссылки меню имеют какую-то особенность при наведении курсора. Когда вы наводите курсор мыши на них обоих, кажется, что они подчеркнуты - или появляется их ссылка. Может быть, нам нужно навести курсор мыши на второй пункт подменю, прежде чем инициировать щелчок?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню