Selenium webdriver Xpath ที่มีจุด (.) ในชื่อแอตทริบิวต์

ฉันมี html ต่อไปนี้:

<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]"));

แต่ฉันได้รับข้อผิดพลาดต่อไปนี้:

Bad token, expected: ] got: .

person Calle    schedule 24.02.2016    source แหล่งที่มา
comment
พยายามหนีจุดของคุณด้วย \   -  person Jagdeep    schedule 24.02.2016
comment
คุณเคยลองใช้ xpath โดยไม่มี mote. เช่นเดียวกับ //tr[@id='12345']/td[1] หรือไม่   -  person Andersson    schedule 24.02.2016
comment
@Andersson ปัญหาคือฉันมีแถวด้วย parentmote.id=12345   -  person Calle    schedule 24.02.2016
comment
@Calle คำแนะนำของ Jagdeep เกี่ยวกับ //tr[@mote\.id='12345']/td[1] ใช้งานไม่ได้ใช่ไหม   -  person Andersson    schedule 24.02.2016
comment
@Calle คุณลองรับแถวทั้งหมดแล้วใช้วิธี GetAttribute ของซีลีเนียมเพื่อกรองแถวจากภายในโค้ดของคุณได้ไหม ดังนั้นให้ทำ Driver.FindElements(By.XPath("//table[@id='oTable']/tbody/tr")) จากนั้นใช้ for loop เพื่อผ่านแต่ละรายการและลบอันที่ไม่มีแอตทริบิวต์ mote.id หรือไม่มีค่าที่ถูกต้องในแอตทริบิวต์ บางที GetAttribute อาจจะหละหลวมเกี่ยวกับจุดกึ่งกลางของแอตทริบิวต์มากกว่า XPath   -  person Ben C    schedule 24.02.2016
comment
@Andersson ไม่ฉันไม่สามารถหลบหนีด้วย \. ฉันได้รับอักขระ excape ที่ผิดกฎหมาย   -  person Calle    schedule 24.02.2016
comment
คุณไม่สามารถค้นหาองค์ประกอบ td โดยตรงโดยไม่มี tr id ได้หรือไม่ <td>Status</td>   -  person Mosam Mehta    schedule 24.02.2016
comment
@Calle คุณแก้ไขปัญหานี้แล้วหรือยัง?   -  person Ben C    schedule 25.02.2016
comment
ใช้ mote\\.id คุณต้องหลบหนี กับ \\   -  person Poojan Dave    schedule 28.06.2017


คำตอบ (4)


หากต้องการค้นหาองค์ประกอบ <td> ให้ใช้:

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

ใช้สิ่งนี้:

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

ไม่จำเป็นต้องใช้ mote.id

มีทางเลือกอื่นเช่นกันโดยการใช้

findElements(By.tagName("td")).get(0);
person Jagdeep    schedule 24.02.2016
comment
ฉันคิดว่า Calle น่าจะทำให้ตัวอย่างของเขาง่ายขึ้น ฉันสงสัยว่าเขาคงจะถามคำถามว่า XPath ธรรมดาแบบนั้นสามารถใช้งานได้หรือไม่ - person Ben C; 24.02.2016
comment
ถูกต้อง @BenChand มีหลายแถวและแอตทริบิวต์เดียวที่ทราบคือ mote.id - person Calle; 24.02.2016

คุณต้องมี \\ สองตัวก่อนจุด โดยอันแรก \ เพื่อให้อันที่สองผ่านไปได้ และอันที่สองเพื่อหนีจากจุดเพื่อให้มันกลายเป็นตัวอักษร ลอง \\.

person Prateek    schedule 24.02.2016

คุณใช้ซีลีเนียมเวอร์ชันใดอยู่? ฉันใช้ 2.52.0 (ล่าสุด ณ ตอนนี้) และบน Python xpath ของคุณใช้งานได้:

>>> 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

หรือคุณสามารถเขียนฟังก์ชันตัวช่วยเพื่อค้นหาองค์ประกอบ tr ที่เกี่ยวข้องทั้งหมด จากนั้นตรวจสอบ mote.id ของแต่ละรายการตามที่คุณต้องการ

>>> 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>

(เห็นได้ชัดว่าช้ากว่า xpath ซึ่งตรงกันโดยตรง แต่ถ้าเป็นปัญหาเวอร์ชัน แสดงว่าเป็นวิธีแก้ปัญหา) และใช่ มันอยู่ใน Python ไม่ใช่ Java แต่ควรชัดเจนว่าเวอร์ชัน Java ควรทำอะไร

PS: มีวิธีใดที่คุณจะทำให้ผู้พัฒนาหรือผู้จำหน่ายผลิตภัณฑ์ของคุณใช้ mote_id หรือ moteid แทน mote.id? ซึ่งจะสอดคล้องกับชื่อแอตทริบิวต์ใน HTML และ XML

person aneroid    schedule 25.02.2016