找到并单击包含特定文本的元素

时间:2017-04-21 20:46:08

标签: python python-2.7 selenium appium

之前可能已经提出过这个问题,但我似乎无法追踪它的位置......但是,我正试图找到一种方法来选择屏幕上具有相同元素的元素。资源ID'作为另一个元素,但不是通过定位两个元素然后选择第二个元素,因为它们都不总是在屏幕上。另外,我不能将XPATH与Class + Text一起使用,因为元素的Text可以/将会改变。我想知道是否有一种方法可以使用资源ID加上文本中的特定字符串'元素(我知道的字符串不会改变)。或者可能使用XPATH与Class +' text'包含一些子文本,例如

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

附加图片显示了我需要能够区分的元素之一。另一个没有图示的元素具有相同的属性,除了' Text'和'包。'

我试过了

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

在哪里验证'是一个允许我区分的子字符串(它包含在第二个元素中,并且该字符串始终存在),但由于您无法点击'值为True或False:)

1 个答案:

答案 0 :(得分:0)

如果你只想匹配一个包含字符串的元素

,你可以使用它

(注意我喜欢使用而不是 text() 来缩短xpath。)

此外,我不知道python API,所以我认为你的命令是正确的(除了xpath)。我熟悉Java。我希望这有帮助(我确实删除了看起来像一组额外的括号)。

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

(注意包含使用 a

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

您可以使用它来完全匹配字符串 (注意当你想要完全匹配时使用 a = ):

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

这与文本完全匹配但修剪周围的空格,使用 normalize-space(text()) normalize-space(。): 您可以使用它来完全匹配字符串:

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

看起来之前的Xpath并不起作用。您可以尝试以下任何一种: 我没有意识到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()

或者     wait = WebDriverWait(self.driver,10)     get_code = wait.until(EC.element_to_be_clickable(By.XPATH," // android.widget.Textview     [@class =' android.widget.Textview'并包含(。,'充电')"])))     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()