Selenium webdriver Xpath dengan titik (.) pada nama atribut

Saya memiliki html berikut:

<table id="oTable">
<tbody>
    <tr mote.id="12345">
        <td>Status</td>
        <td>1</td>
    </tr>
    <tr mote.id="54321">
        <td>Status</td>
        <td>2</td>
    </tr>
</tbody>

I want to locate the row with mote.id and click the first td-tag

WebElement element = getDriver().findElement(By.xpath("//tr[@mote.id='12345']/td[1]"));

Tapi saya mendapatkan Kesalahan berikut:

Bad token, expected: ] got: .

person Calle    schedule 24.02.2016    source sumber
comment
Cobalah untuk keluar dari titik Anda dengan \.   -  person Jagdeep    schedule 24.02.2016
comment
sudahkah Anda mencoba menggunakan xpath tanpa mote., sama seperti //tr[@id='12345']/td[1] ?   -  person Andersson    schedule 24.02.2016
comment
@Andersson Masalahnya saya juga punya baris dengan parentmote.id=12345   -  person Calle    schedule 24.02.2016
comment
@Calle, saran Jagdeep tentang //tr[@mote\.id='12345']/td[1] juga tidak berhasil?   -  person Andersson    schedule 24.02.2016
comment
@Calle bisakah Anda mencoba mendapatkan semua baris dan kemudian menggunakan metode GetAttribute Selenium untuk memfilter baris dari dalam kode Anda? Jadi lakukan Driver.FindElements(By.XPath("//table[@id='oTable']/tbody/tr")) dan kemudian gunakan perulangan for untuk menelusuri masing-masing dan menghapus yang tidak memiliki atribut mote.id atau tidak memiliki nilai yang benar dalam atributnya. Mungkin GetAttribute akan lebih longgar mengenai titik di tengah atribut daripada XPaths.   -  person Ben C    schedule 24.02.2016
comment
@Andersson, Tidak, saya tidak bisa melarikan diri dengan \. saya mendapatkan karakter Excape ilegal   -  person Calle    schedule 24.02.2016
comment
Tidak bisakah Anda langsung menemukan elemen td tanpa tr id? <td>Status</td>   -  person Mosam Mehta    schedule 24.02.2016
comment
@Calle apakah Anda memperbaiki masalah ini?   -  person Ben C    schedule 25.02.2016
comment
Gunakan mote\\.id Anda harus melarikan diri. dengan \\   -  person Poojan Dave    schedule 28.06.2017


Jawaban (4)


Untuk menemukan elemen <td>, gunakan:

WebElement element = getDriver().findElement(By.xpath("//td[contains(text(),'Status')]"));
person Mosam Mehta    schedule 24.02.2016

Gunakan ini:

findElement(By.xpath("//tbody/tr[1]/td[1]")) 

Tidak perlu mote.id.

Ada pendekatan alternatif juga dengan menggunakan

findElements(By.tagName("td")).get(0);
person Jagdeep    schedule 24.02.2016
comment
Saya pikir Calle mungkin telah menyederhanakan contohnya. Saya ragu dia akan menanyakan pertanyaan apakah XPath sederhana seperti itu bisa berhasil. - person Ben C; 24.02.2016
comment
Itu benar @BenChand. Ada banyak baris dan satu-satunya atribut yang diketahui adalah mote.id - person Calle; 24.02.2016

Anda memerlukan dua \\ sebelum titik, \ pertama agar \ kedua dapat melewatinya, dan \ kedua untuk keluar dari titik sehingga menjadi literal. Coba \\..

person Prateek    schedule 24.02.2016

Anda menggunakan Selenium versi yang mana? Saya menggunakan 2.52.0 (terbaru sampai sekarang) dan menggunakan Python. Xpath Anda berfungsi:

>>> print driver.find_element_by_xpath("//*[@mote.id='12345']").get_attribute('innerHTML')

        <td>Status</td>
        <td>1</td>
>>>
>>> print driver.find_element_by_xpath("//tr[@mote.id='12345']/td[1]").get_attribute('innerHTML')
Status

Alternatifnya, Anda dapat menulis fungsi pembantu untuk menemukan semua elemen tr yang relevan dan kemudian memeriksa mote.id masing-masing elemen sesuai keinginan Anda.

>>> def get_mote_by_id(mote_id):
...     elems = driver.find_elements_by_xpath("//*[@id='oTable']/tbody/tr")
...     for elem in elems:
...         if elem.get_attribute('mote.id') == mote_id:
...             return elem
...
>>>
>>> print get_mote_by_id('12345').get_attribute('innerHTML')

        <td>Status</td>
        <td>1</td>

(Ini jelas lebih lambat daripada xpath yang cocok secara langsung tetapi jika itu masalah versi, maka itu solusinya.) Dan Ya, ini menggunakan Python bukan Java tetapi harus jelas apa yang harus dilakukan versi Java.

PS: Adakah cara agar pengembang atau vendor produk Anda menggunakan mote_id atau moteid alih-alih mote.id? Itu akan sesuai dengan nama atribut dalam HTML dan XML.

person aneroid    schedule 25.02.2016