簡體   English   中英

使用Selenium從表中獲取數據

[英]Getting data from table using Selenium

我有一個費用表我試圖解析返回數據,但它在實際返回數據字符串之前返回了一些空格。

<table id="Fees">
            <thead>
                <tr>
                    <th>Rate Code</th>
                    <th>Description</th>
                    <th>Amount</th>
                </tr>
            </thead>
            <tbody>
                    <tr>
                        <td class="code">A1</td>
                        <td>Charge Type 1</td>
                        <td class="amount">$11.20</td>
                    </tr>
                    <tr>
                        <td class="code">C2</td>
                        <td>Charge Type 2</td>
                        <td class="amount">$36.00</td>
                    </tr>
                    <tr>
                        <td class="code">CMI</td>
                        <td>Cuba Medical Insurance</td>
                        <td class="amount">$25.00</td>
                    </tr>
            </tbody>
            <tfoot>
                <tr>
                    <td colspan="2">Total:</td>
                    <td class="amount">$145.16</td>
                </tr>
            </tfoot>
</table>

我通過xpath返回

private By lst_Fee
{
    get { return By.XPath("//*[@id=\"Fees\"]/tbody/tr"); }
}

Selenium代碼:

IList<IWebElement> fees = GetNativeElements(lst_Fee, 5);
List<string> actual = new List<string>();
foreach (IWebElement elem in fees)
{
    actual.Add(GetText(elem, ControlType.Label));
}

問題

  1. ControlType.Label對於表是否正確? 在實際獲取數據之前,我得到了一些空白元素。
  2. 如果我想將每個項目中的每個費率,描述和費用分開,以確保費用正確加到Total,我該怎么做?

我會做類似下面的事情。 我創建了一個課程Fee ,用於支付部分費用:代碼,描述和金額。 對於每個表行,您將提取這三個值並將它們存儲在Fee類的實例中。 該函數返回Fee實例的集合。 要獲得費用本身的總和,您可以調用GetFees()方法,然后迭代Fee實例,將amount匯總到最終總計中。

public class Fee
{
    private String code;
    private String desc;
    private BigDecimal amount;

    private Fee(String _code, String _desc, BigDecimal _amount)
    {
        this.code = _code;
        this.desc = _desc;
        this.amount = _amount;
    }
}

public List<Fee> GetFees()
{
    List<Fee> fees = new ArrayList<Fee>();
    List<WebElement> rows = driver.findElements(By.cssSelector("#Fees > tbody > tr"));
    for (WebElement row : rows)
    {
        List<WebElement> cells = row.findElements(By.cssSelector("td"));
        fees.add(new Fee(cells.get(0).getText(), cells.get(1).getText(), parse(cells.get(2).getText(), Locale.US)));
    }

    return fees;
}

// borrowed from http://stackoverflow.com/a/23991368/2386774
public BigDecimal parse(final String amount, final Locale locale) throws ParseException
{
    final NumberFormat format = NumberFormat.getNumberInstance(locale);
    if (format instanceof DecimalFormat)
    {
        ((DecimalFormat) format).setParseBigDecimal(true);
    }
    return (BigDecimal) format.parse(amount.replaceAll("[^\\d.,]", ""));
}
You can grab all the column headers and as well the row data by the below code:
Happy coding =
 //// Grab the table
            IWebElement grid;
            grid = _browserInstance.Driver.FindElement(By.Id("tblVoucherLookUp"));
            IWebElement headercolumns = grid.FindElement(By.Id("tblVoucherLookUp"));
          _browserInstance.Driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(75));
            _browserInstance.ScreenCapture("Voucher LookUp Grid");

                //// get the column headers
            char[] character = "\r\n".ToCharArray();
            string[] Split = headercolumns.Text.Split(character);

            for (int i = 0; i < Split.Length; i++)
            {
                if (Split[i] != "")
                {
                    _log.LogEntry("INFO", "Voucher data", true,
                    Split + " Text matches the expected:" + Split[i]);
                }
            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM