【问题标题】:Selenium, build XPath in java, to click on the buttonSelenium,在java中构建XPath,点击按钮
【发布时间】:2022-01-05 14:26:20
【问题描述】:

我需要你的帮助来构建 XPath,点击按钮:

HTML 是:

<div class="offer col-md gtm-data gtm-impression slick-slide" data-gtm-id="5608" data-gtm-title="230 גיגה Rolling Package" data-gtm-price="33.00" data-gtm-category="חבילות" data-gtm-list="homepage" data-gtm-position="4" data-slick-index="3" aria-hidden="true" tabindex="-1" style="width: 370px;" xpath="1">
    <div class="upper">
        <div class="title"><spam class="threshold">230</spam><spam class="units">GB</spam></div>
        <div class="subtitle"><p>Rolling Package</p>
</div>
        <!--<div class="comment"><span>test</span></div>-->
    </div>
    <div class="bottom">
      <div class="price-area">
        <div class="title"><spam class="price-number"><span class="number">33</span></spam> </div>
        <div class="subtitle">
            <span></span>
        </div>
      </div>
      <div class="link">
            <a href="en/userGuide/step1?packageidReg=5608&amp;packageidChange=5609&amp;process=CustomerGuide" class="button red full gtm-click" title="Join Now" tabindex="-1" style="">Join Now</a>
        </div>
    </div>
</div>

当我尝试点击按钮时, 通过 XPath:

//div[contains(@data-gtm-id, '5608')] //a[@class='button red full gtm-click']

我收到了这个错误:

org.openqa.selenium.ElementClickInterceptedException: element click intercepted: Element <a href="userGuide/step1?packageidReg=5608&amp;packageidChange=5609&amp;process=CustomerGuide" class="button red full gtm-click" title="..." tabindex="0">להצטרפות</a> is not clickable at point (951, 858). Other element would receive the click: <p>...</p>
  (Session info: chrome=96.0.4664.45)

当我尝试时:

(//a[contains(@class,'button red')])[2]

我可以点击按钮, 但我希望代码更加动态。

【问题讨论】:

    标签: java selenium xpath css-selectors webdriverwait


    【解决方案1】:

    data-gtm-id属性是Google Tag Manager属性,data-gtm-id属性的值即5608是动态生成的.每次您访问应用程序时,它都会被更改。因此,您将无法使用属性 data-gtm-id

    定位元素

    到元素上的click(),文本为立即加入,您可以使用以下任一Locator Strategies

    • 链接文本

      driver.findElement(By.linkText("Join Now")).click();
      
    • cssSelector

      driver.findElement(By.cssSelector("a.button.red.full.gtm-click[title='Join Now']")).click();
      
    • xpath

      driver.findElement(By.xpath("//a[@class='button red full gtm-click' and text()='Join Now']")).click();
      

    但是,由于元素是动态元素,因此要在元素上使用click(),您需要将WebDriverWait 诱导为elementToBeClickable(),并且您可以使用以下Locator Strategies 之一:

    • 链接文本

      new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.linkText("Google"))).click();
      
    • cssSelector

      new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("a.button.red.full.gtm-click[title='Join Now']"))).click();
      
    • xpath

      new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//a[@class='button red full gtm-click' and text()='Join Now']"))).click();
      

    【讨论】:

    • 感谢您的回答,我们系统中的“data-gtm-id”标签是定义客户可以购买的包,不是动态的,系统中有几个,用于每个包 - 都有它的编号,所以它确实将每个包定义为唯一的,你能给我一个例子,因为我可以启用这个按钮,这取决于“data-gtm-id”标签吗?
    • 我们在Selenium room 讨论这个问题。
    【解决方案2】:

    我希望你的元素是正确的,但它在加载之前点击,所以请添加等待条件。

    By joinNowBtn = By.xpath("//a[contains(text(),'Join Now')]");
    WebDriverWait wait = new WebDriverWait(driver, 20);
    wait.until(ExpectedConditions.elementToBeClickable(joinNowBtn));
    wait.until(ExpectedConditions.visibilityOfElementLocated(joinNowBtn));
    driver.findElement(joinNowBtn).click();
    

    【讨论】:

      猜你喜欢
      • 2018-12-08
      • 2022-10-03
      • 1970-01-01
      • 2021-06-09
      • 2013-12-15
      • 2020-06-24
      • 1970-01-01
      • 2016-04-29
      • 2015-04-25
      相关资源
      最近更新 更多