【问题标题】:Locate and click element that contains specific text找到并单击包含特定文本的元素
【发布时间】:2017-09-18 23:44:32
【问题描述】:

这个问题之前可能已经被问过,但我似乎无法追踪它的位置......但是,我正在尝试找到一种方法来选择屏幕上具有相同“resource-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”和“Package”除外。

我试过了

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

“validation”是一个允许我区分的子字符串(它包含在第二个元素中,并且该字符串始终存在),但这会失败,因为您不能“单击”True 或错误:)

【问题讨论】:

  • 我认为 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 no attribute 'click'

标签: python python-2.7 selenium appium


【解决方案1】:

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

(注意我喜欢使用 . 而不是 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()

为了与文本完全匹配但修剪周围的空白,请使用 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()

或者 等待 = WebDriverWait(self.driver, 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()

【讨论】:

  • 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 个)”
  • 我想我在示例中遗漏了一些括号,因此我查看了 Selenium for Python 文档并更新了我的代码示例。
  • 使用修改版时结果相同,'get_code = wait.until(EC.element_to_be_clickable(By.XPATH, "//android.widget.TextView[contains(text(),'validation') ]")) 类型错误:__init__() 正好接受 2 个参数(给定 3 个)'
  • 还有其他想法吗?或者可能对您的第一个答案的格式进行修改,使其只有 2 个参数...
  • 我提出了更多建议,如果其中任何一项工作,请发表评论,以便我可以更新其他建议以供将来在 Xpath for Android 上寻求帮助的人使用。
猜你喜欢
  • 1970-01-01
  • 2021-08-17
  • 2016-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 2012-09-01
  • 2022-12-29
相关资源
最近更新 更多