之前可能已经提出过这个问题,但我似乎无法追踪它的位置......但是,我正试图找到一种方法来选择屏幕上具有相同元素的元素。资源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:)
答案 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()