Не удается нажать кнопку с помощью Xpath - PullRequest
0 голосов
/ 02 августа 2020

привет, я пытаюсь нажать кнопку, используя Xpath в браузере chrome, но по какой-то причине программа не нажимает на нее. Я использовал devtools inspect, чтобы скопировать Xpath в функцию findElement. это веб-сайт: https://mynames.co.il/ извините, это на иврите ...

на этой фотографии изображена кнопка, я выделил кнопку синим

это файл шагов:

package stepDefinitions;

import java.io.IOException;
import java.nio.file.Paths;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.WebDriverWait;

import cucumber.api.PendingException;
import cucumber.api.java.After;
import cucumber.api.java.Before;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;

public class purchaseDomainSteps {

    
    
WebDriver driver;
    
    
    @Before
    public void setup() throws IOException {
        System.setProperty("webdriver.chrome.driver", Paths.get(System.getProperty("user.dir")).toRealPath() +  "\\src\\test\\java\\drivers\\chromedriver.exe");
        this.driver = new ChromeDriver();
        this.driver.manage().window().maximize();
        this.driver.manage().timeouts().pageLoadTimeout(120, TimeUnit.SECONDS);
    }
    
    @After() 
    public void tearDown() {
        this.driver.manage().deleteAllCookies();
        this.driver.quit();
    }
    
    
    
    

@Given("^I access https://mynames\\.co\\.il$")
public void i_access_https_mynames_co_il() throws Throwable {
    driver.get("https://mynames.co.il/");
    throw new PendingException();
}

@When("^I click on Login button\\.$")
public void i_click_on_Login_button() throws Throwable {
    
    
    String path = "/html/body/div[1]/div/div/section[2]/div/div/div[2]/div/div/section/div/div/div[2]/div/div/div/div/div/a/span/span";
    //WebDriverWait wait = new WebDriverWait(driver, 5);
    driver.findElement(By.xpath(path)).click();
    throw new PendingException();
}

это класс бегуна:

package runners;

import org.junit.runner.RunWith;

import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;

@RunWith(Cucumber.class)

@CucumberOptions(features = { "src/test/java/featurefiles/" }, glue = {
        "stepDefinitions" }, monochrome = true, tags = {}, 
                plugin = { "pretty", "html:target/cucumber", "json:target/cucumber.json",
                "com.cucumber.listener.ExtentCucumberFormatter:output/report.html" })


public class MainRunner {

    
}

Ответы [ 4 ]

0 голосов
/ 03 августа 2020

Поскольку элемент является динамическим c элементом, поэтому для click() элемента вам необходимо вызвать WebDriverWait для elementToBeClickable(), и вы можете использовать любую из следующих стратегий локатора :

  • cssSelector:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("a.elementor-button-link.elementor-button.elementor-size-xs span.elementor-button-text"))).click();
    
  • xpath:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//span[@class='elementor-button-text' and text()='כניסה']"))).click();
    
0 голосов
/ 02 августа 2020

После проверки сайта (https://mynames.co.il/):

<div class="elementor-button-wrapper">
   <a href="https://dash.mynames.co.il/login" target="_blank" class="elementor-button-link elementor-button elementor-size-xs" role="button">
      <span class="elementor-button-content-wrapper">
         <span class="elementor-button-text">כניסה</span>
      </span>
   </a>
</div>

Я рекомендую 2 варианта:

  1. Используйте саму ссылку, чтобы перенаправление на страницу входа
String targetPage = driver.findElement(By.xpath("/html/body/div[1]/div/div/section[2]/div/div/div[2]/div/div/section/div/div/div[2]/div/div/div/div/div/a")).getAttribute("href");
driver.navigate().to(targetPage);
(Возможно, это то, что вы хотите) Вы нажимаете на href или принудительно a href, чтобы действовать как кнопка
driver.findElement(By.xpath("/html/body/div[1]/div/div/section[2]/div/div/div[2]/div/div/section/div/div/div[2]/div/div/div/div/div/a")).click();

Причина, по которой ваш код не работает потому что span, который вы принимаете за кнопку, не имеет никакого действия щелчка, в то время как действие щелчка, на которое вы надеетесь, находится на a href.

// this is just text with style inside span
<span class="elementor-button-text">כניסה</span>
0 голосов
/ 02 августа 2020

У вас есть исключение? Если да, то какое исключение? Если нет, происходит щелчок селеном, но приложение не подтверждает щелчок. Поэтому попробуйте использовать javascript исполнителя для выполнения щелчка, как показано ниже

WebElement ele = driver.findelement(By.xpath("//span[text()='כניסה']"));
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("argument[0].click();",ele); 

Даже после использования приведенного выше кода, если он не работает, проверьте, ссылаетесь ли вы на правильные файлы функций и классов в junit runner class cucumberOptions 'glue' и 'features'

Еще один важный совет: я вижу абсолютный xpath в вашем скрипте, который не будет работать, если в структуре DOM в будущем произойдут изменения, поэтому всегда go для относительный xpath

0 голосов
/ 02 августа 2020

Привет, пожалуйста, используйте этот Xpath, чтобы щелкнуть ту кнопку, которую вы отметили синей цветной линией

//span[contains(text(),'כניסה')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...