Как нажать на кнопку в соответствии с HTML через Selenium? - PullRequest
0 голосов
/ 25 августа 2018

Я пытаюсь найти и нажать эту кнопку, используя селен:

<button class="orangeButton nextStep js-submitForm js-pop" data-href="/user/welcome/subscribe">Take me to my Subscriptions</button>

Однако идентификатора нет, а имя класса слишком длинное, поэтому я хочу использовать xpath. Тем не менее, я не понимаю, как его использовать ..

Текущий код:

driver.FindElement(By.XPath("//button[@class='orangeButton nextStep js-submitForm js-pop\'")).Click();

Но это не так, как неверный аргумент xpath

Ответы [ 4 ]

0 голосов
/ 27 августа 2018

нет.способов, которые вы можете попробовать с помощью xpath, просто попробуйте следующие выражения xpath:

"//button[@class='orangeButton nextStep js-submitForm js-pop']"
"//*[@class='orangeButton nextStep js-submitForm js-pop']"
"//*[contains(@class,'orangeButton nextStep js-submitForm js-pop')]"
"//*[contains(@class,'orangeButton')]" // contains() can accept partial text as well

Также проверьте ниже (работает или нет)

"//*[contains(@data-href,'/user/welcome/subscribe')]"
"//*[contains(@data-href,'subscribe')]"

с помощью AND и или или OR

"//*[@class='orangeButton nextStep js-submitForm js-pop' and @data-href='/user/welcome/subscribe']"
"//*[@class='orangeButton nextStep js-submitForm js-pop' OR @data-href='/user/welcome/subscribe']"
0 голосов
/ 25 августа 2018

Нет необходимости использовать все классы, чтобы найти элемент, только те, которые делают элемент уникальным.

По css:

driver.FindElement(By.CssSelector("button.nextStep"));
driver.FindElement(By.CssSelector("button.orangeButton.nextStep"));
driver.FindElement(By.CssSelector("button.orangeButton.nextStep.js-submitForm.js-pop"));

По xpath и классу:

driver.FindElement(By.XPath("//button[contains(@class,'orangeButton) and contains(@class,'nextStep)'"));

По xpath и тексту:

driver.FindElement(By.Xpath("//button[normalize-space(., 'Take me to my Subscriptions')"));
0 голосов
/ 26 августа 2018

В соответствии с HTML, которым вы поделились, желаемый элемент является JavaScript включенным элементом, поэтому вам нужно вызвать WebDriverWait , чтобы элемент был кликабельным, и вы можете использовать любой из следующих решения:

  • xpath:

    new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(ExpectedConditions.ElementToBeClickable(By.XPath("//button[@class='orangeButton nextStep js-submitForm js-pop' and contains(@data-href,'subscribe')][contains(.,'Take me to my Subscriptions')]"))).Click();
    
  • cssSelector:

    new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(ExpectedConditions.ElementToBeClickable(By.CssSelector("button.orangeButton.nextStep.js-submitForm.js-pop[data-href$='subscribe']"))).Click();
    
0 голосов
/ 25 августа 2018

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

driver.FindElement(By.Xpath("//button[contains(@class, 'orangeButton') and contains(@class, 'nextStep') and contains(@class, 'js-submitForm') and contains(@class, 'js-pop')]"));
...