Как обрабатывать Xpaths, которые каждый раз динамически меняются?

Я пишу скрипт веб-драйвера селена. Сценарий скрипта:
1) Войти на www.yahoomail.com
2) Войти успешно.
3) Нажмите кнопку "Написать".
4) Введите идентификатор электронной почты в поле "Кому".
5) Введите тему в поле «Тема».
6) Введите текст сообщения в поле «Текст».
7) Нажмите кнопку «Отправить».

Используя Firepath, я взял xpath полей, упомянутых на странице «Создать». Но каждый раз, когда я открываю страницу Compose, эти xpaths динамически меняются.

Ниже приведен сценарий, который я использую:

    WebDriver oYahoo = new FirefoxDriver();
    oYahoo.get("http://www.yahoomail.com/");
    oYahoo.manage().window().maximize();
    oYahoo.findElement(By.xpath(".//*[@id='login-username']")).sendKeys("[email protected]");
    oYahoo.findElement(By.xpath(".//*[@id='login-passwd']")).sendKeys("sfgas234@123");
    oYahoo.findElement(By.xpath(".//*[@id='login-signin']")).click();
    oYahoo.findElement(By.xpath(".//*[@id='Compose']/button")).click();
    oYahoo.findElement(By.xpath(".//*[@id='yui_3_16_0_1_1448364357109_2222']")).sendKeys("[email protected]");
    oYahoo.findElement(By.xpath(".//*[@id='subject-field']")).sendKeys("Hi This is my first automated mail");
    oYahoo.findElement(By.xpath(".//*[@id='yui_3_16_0_1_1448364357109_1966']")).sendKeys("Hi This is my first automated mail");
    oYahoo.findElement(By.xpath(".//*[@id='yui_3_16_0_1_1448364357109_2465']")).click();
    oYahoo.quit();

Что мы можем сделать, чтобы он принимал Xpath динамически? Нужно ли нам отображать эти вещи в каком-то классе? мы должны написать какой-либо другой класс для всплывающего окна «Создать»? Если "Да", то как мы можем это сделать?


person abhishek    schedule 03.12.2015    source источник
comment
Это основной вопрос автоматизации. Я предлагаю вам сделать такие вещи, как поиск первого элемента с идентификатором, например, yui_*. или найти базовый элемент, из которого затем можно найти дочерние элементы.   -  person DMart    schedule 08.12.2015


Ответы (2)


Старайтесь наблюдать общую закономерность, которая повторяется каждый раз. Либо префикс идентификатора, либо префикс класса, что угодно.

Затем используйте следующий селектор в вашей функции By.xpath(..).

//*[contains(@id,’your-common-pattern’)].

person Abhinav    schedule 03.12.2015

Я работал над проектом, в котором имена классов были случайными каждый раз, когда страница генерировалась, и единственный способ, который я нашел для получения этих меток/ввода/.., заключается в том, что я использовал функцию nth-child() с селектором css. Метод мышления такой: мне нужен третий ввод из 2-й строки 1-й таблицы.

проверьте эту скрипку, чтобы понять, что я имел в виду. https://jsfiddle.net/8v150af1/

person e1che    schedule 03.12.2015