2017-04-21 106 views
0

此问题可能以前曾被问过,但我似乎无法追踪其位置......但是,我试图找到一种方法在屏幕上选择具有与另一个元素相同的“resource-id”,但不是通过定位这两个元素,然后选择第二个元素,因为它们并不总是在屏幕上。另外,我不能仅仅使用Class + Text的XPATH,因为元素的文本可以/将会改变。我想知道是否有一种方法可以在元素的“文本”中使用resource-id加上特定的字符串(我知道这个字符串不会改变)。或者使用一个带班+“文本” XPATH包含一些子文,e.g,找到并单击包含特定文本的元素

get_code = WebDriverWait(self.driver, 3).until(
    EC.element_to_be_clickable((By.XPATH, "//android.widget.TextView[@text.contains='differentiatable sub-string']"))) 
    element.click() 

图片附件是我需要能够区分的要素之一。另一个元素,没有图片,除了“文本”和“包装”之外,具有相同的属性。

我已经试过

element = WebDriverWait(self.driver, 3).until(
    EC.text_to_be_present_in_element((By.ID, "android:id/big_text"), "validation")) 
    element.click() 

其中“验证”是一个子串,让我来区分(它包含在第二个元素,而该字符串总是存在)但是由于不能'点击'True或False的值而失败:)

+0

我以为element = WebDriverWait(self.driver,3).until( EC.text_to_be_present_in_element((By.ID,“android:id/big_text”),'validation')) element.click()可能工作,但我有同样的问题...'AttributeError:'bool'object has没有属性'点击' – cjg123

回答

0

如果您只是想匹配包含字符串的元素,您可以使用它

(注意我喜欢用而不是text()做出的XPath有点短。)

此外,我不知道python的API,所以我理所当然的命令是正确的(比其他的XPath)。我熟悉Java。我希望这会有所帮助(但我确实删除了看起来像是一组额外的括号)。

Here's an example of locating Xpath for Android from saucelabs

(与注意包含使用一个

from selenium.webdriver.support import expected_conditions as EC 

wait = WebDriverWait(self.driver, 10) 
get_code = wait.until(EC.element_to_be_clickable(By.XPATH, "//TextView[contains(.,'differentiatable sub-string')"]))) 
element.click() 

您可以使用此字符串完全匹配 (请注意,当你想要一个精确匹配使用=):

from selenium.webdriver.support import expected_conditions as EC 

wait = WebDriverWait(self.driver, 10) 
get_code = wait.until(EC.element_to_be_clickable(By.XPATH, "//TextView[.='differentiatable sub-string')"]))) 
element.click() 

这将文本完全一致,但修剪周围的空白,使用正常化空间(文字())正常化空间(。): 您可以使用此字符串完全匹配:

from selenium.webdriver.support import expected_conditions as EC 

wait = WebDriverWait(self.driver, 10) 
get_code = wait.until(EC.element_to_be_clickable(By.XPATH, "//TextView[normalize-space(.)='differentiatable sub-string']))) 
element.click() 

它看起来像以前的Xpaths不工作。您可以尝试以下任意一种: 我没有意识到Android文本是元素的实际属性。所以,你可能需要使用下面的,而不是我在做什么之前:

wait = WebDriverWait(self.driver, 10) 
get_code = wait.until(EC.element_to_be_clickable(By.XPATH,"//android.widget.Textview 
[@class='android.widget.Textview' and contains(@text,'Charging')"]))) 
element.click() 

或者 等待= WebDriverWait(自我。驱动程序,10) get_code = wait.until(EC.element_to_be_clickable(By.XPATH,“// android.widget.Textview [@ class ='android.widget.Textview'and contains(。,'Charging')”] ))) element.click()

如果没有这些工作

wait = WebDriverWait(self.driver, 10) 
get_code = wait.until(EC.element_to_be_clickable(By.XPATH,//FrameLayout[1]//LinearLayout[2]//TextView[1]))) 
element.click() 

或者,您可能需要使用完整的类名(请更正元素名称,如果这些都不是正确的):

wait = WebDriverWait(self.driver, 10) 
get_code = wait.until(EC.element_to_be_clickable(By.XPATH,//android.widget.FrameLayout[1]//android.widget.LinearLayout[2]//android.widget.TextView[1]))) 
element.click() 
+0

element = WebDriverWait(self.driver,3).until( EC.element_to_be_clickable(By.XPATH,“//android.widget.TextView[contains(text(),'validation')]”) ) element.click() - 给我“TypeError:__init __()需要2个参数(3给出)” – cjg123

+0

我想我错过了我的例子中的一些括号,所以我查看了Selenium for Python文档并更新了我的代码示例。 –

+0

使用修改后的版本'get_code = wait.until(EC.element_to_be_clickable(By.XPATH,“//android.widget.TextView[contains(text(),'validation')]”))时的结果相同 TypeError: __init __()只需要2个参数(给出3个)' – cjg123

相关问题