Selenium Python如何使用XPath

时间:2016-03-17 13:51:06

标签: python-2.7 selenium xpath selenium-webdriver

我点击了一个元素,显示了一个对话框。在此对话框中有2个表(HTML)。表格中的表格。 表1包含文本"匹配审计代码" 表2有一些行和列。 第1列有一个复选框第2列具有char值,例如这封信"我") 第3列有一些文字,例如"与完整地址匹配"

我想找到第1列的复选框,其中包含文字说明"匹配到完整地址" 父表文字"匹配审核代码"

我尝试了以下Xpath,找到了包含文本"匹配到完整地址的复选框"

//div[contains(text(), "Matched to full address")]/ancestor::tr[1]/td[1]//input

我的Selenium Python脚本不会单击此复选框。开发人员说,可能有超过1"匹配到完整地址"在HTML的某个地方。

我需要Xpath从父表开始,其中包含文本"匹配审核代码" ,然后转到下一页,其中包含文字"与完整地址匹配" ,然后找到该复选框。

我怎么能建立Xpath?

HTML是:

 <table class="GJPPK2LBAL" cellspacing="0" cellpadding="0">
    <tbody>
    <tr>
        <td align="left" style="vertical-align: top;">
            <div class="GJPPK2LBPK">Match audit codes</div>
        </td>
        <td align="left" style="vertical-align: top;">
            <button class="gwt-Button GJPPK2LBLK" type="button">X</button>
        </td>
    </tr>
    </tbody>
</table>
<table class="GJPPK2LBOK" cellspacing="0" cellpadding="0">
    <tbody>
    <tr>
        <td align="left" style="vertical-align: middle;">
            <table cellspacing="0" cellpadding="0">
                <tbody>
                <tr>
                <tr>
                    <td align="left" style="vertical-align: top;">
                        <div style="overflow: auto; position: relative; width: 25em;">
                            <div style="position: relative;">
                                <table class="GJPPK2LBJE" cellspacing="0"
                                       __gwtcellbasedwidgetimpldispatchingfocus="true"
                                       __gwtcellbasedwidgetimpldispatchingblur="true">
                                    <thead aria-hidden="false">
                                    <colgroup>
                                    <tbody>
                                    <tr class="GJPPK2LBCD" __gwt_subrow="0" __gwt_row="0">
                                        <td class="GJPPK2LBBD GJPPK2LBDD GJPPK2LBED">
                                            <div __gwt_cell="cell-gwt-uid-5972" style="outline-style:none;">
                                                <input type="checkbox" tabindex="-1"/>
                                            </div>
                                        </td>
                                        <td class="GJPPK2LBBD GJPPK2LBDD">
                                            <div __gwt_cell="cell-gwt-uid-5973" style="outline-style:none;">I</div>
                                        </td>
                                        <td class="GJPPK2LBBD GJPPK2LBDD GJPPK2LBOD">
                                            <div __gwt_cell="cell-gwt-uid-5974" style="outline-style:none;">Matched to
                                                full address
                                            </div>
                                        </td>
                                    </tr>
                                    <tr class="GJPPK2LBCE" __gwt_subrow="0" __gwt_row="1">
                                        <td class="GJPPK2LBBD GJPPK2LBDE GJPPK2LBED">
                                            <div __gwt_cell="cell-gwt-uid-5972" style="outline-style:none;">
                                                <input type="checkbox" tabindex="-1"/>
                                            </div>
                                        </td>
                                        <td class="GJPPK2LBBD GJPPK2LBDE">
                                            <div __gwt_cell="cell-gwt-uid-5973" style="outline-style:none;">B</div>
                                        </td>
                                        <td class="GJPPK2LBBD GJPPK2LBDE GJPPK2LBOD">
                                            <div __gwt_cell="cell-gwt-uid-5974" style="outline-style:none;">Matched to
                                                building
                                            </div>
                                        </td>
                                    </tr>
                                    <tr class="GJPPK2LBCD" __gwt_subrow="0" __gwt_row="2">
                                    <tr class="GJPPK2LBCE" __gwt_subrow="0" __gwt_row="3">
                                    </tbody>
                                    <tbody style="display: none;">
                                    <tfoot style="display: none;" aria-hidden="true"/>
                                </table>

谢谢, 里亚兹

2 个答案:

答案 0 :(得分:3)

我不确定我是否收到你的问题。您想要找到包含&#34;匹配审核代码&#34;的表格,然后转到包含&#34;匹配到完整地址&#34;的下一个表格,并在该表格内搜索同一行中的复选框作为&#34;匹配到完整地址&#34;文本?

如果是这样,那么它应该是这样的:

private static class DBHelper extends SQLiteOpenHelper {
    public static final String DB_NAME = "todolist.db";
    public static final int DB_VERS = 1;
    public static final String TABLE = "notes";

    public static final String _ID = BaseColumns._ID;
    public static final String NOTE_TITLE  = "note_title";
    public static final String NOTE_CONTENT = "note_content";
    public static final String ALARM_SET = "alarm_set";


    public DBHelper(Context context) {
        super(context, DB_NAME, null, DB_VERS);
    }
@Override
public void onCreate(SQLiteDatabase db) {
    // Creates Database

    String sqlQuery = "CREATE TABLE " + TABLE + " (" +
            _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            NOTE_TITLE + " TEXT, " +
            NOTE_CONTENT + " TEXT, " +
            ALARM_SET + " TEXT" + ");";
    db.execSQL(sqlQuery);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE);
    onCreate(db);
}
}

如果//table[.//div[text()='Match audit codes']]/following-sibling::table[.//div[.='Matched to full address']][1]//div[.='Matched to full address']/ancestor::tr[1]/td//input[@type='checkbox'][1] 不起作用,请尝试.='Matched to full address'

答案 1 :(得分:1)

这是一个提示:

查找要匹配文本的所有元素。

List<WebElement> texts = driver.findElements(By.xpath("//td[@class='GJPPK2LBBD GJPPK2LBDE GJPPK2LBOD']"));

现在存储包含所需文本的元素的索引。

List<Integer> list = new ArrayList<>();
for(int i=0;i<list.size();i++){
if(text.get(i).getText().equals("Matched to full address"))
list.add(i);
}

现在您拥有所有索引的列表,其中文本为“匹配到完整地址”。您现在可以调用相应的复选框并播放。

List<WebElement> checks = driver.findElements(By.xpath("//td[@class='GJPPK2LBBD GJPPK2LBDE GJPPK2LBED']"));

for(int index:checks){
WebElement cb = checks.get(index);
//Do something with cb
}

希望它有所帮助。