【问题标题】:Viable locator strategies for partial link text in webdriverwebdriver中部分链接文本的可行定位器策略
【发布时间】:2021-10-08 13:01:39
【问题描述】:

我正在测试一个消息应用程序,我打算让代码等到它收到消息“你好,我叫 Jeff”。

我尝试了 2 段失败的代码:

msg_receive_1 = WebDriverWait(driver1, 15).until(
        EC.visibility_of_element_located((By.PARTIAL_LINK_TEXT, "Hello"))
    )
msg_receive_1 = WebDriverWait(driver1, 15).until(
        EC.visibility_of_element_located((By.LINK_TEXT, "Hello, my name is Jeff."))
    )

元素的可见性是否是部分链接文本的次等选择?如果是这样,什么是可行的替代方案?

如果是其他问题,可能是什么?

【问题讨论】:

    标签: python selenium webdriver appium


    【解决方案1】:

    您应该使用 XPath,而不是链接文本。
    试试这个:

    msg_receive_1 = WebDriverWait(driver1, 15).until(
        EC.visibility_of_element_located((By.XPATH, "//*[contains(text(),'Hello')]"))
    )
    

    或者这个:

    msg_receive_1 = WebDriverWait(driver1, 15).until(
        EC.visibility_of_element_located((By.XPATH, "//*[contains(text(),'Hello, my name is Jeff')]"))
    )
    

    如果您确定文本字符串,它也可以是:

    msg_receive_1 = WebDriverWait(driver1, 15).until(
        EC.visibility_of_element_located((By.XPATH, "//*[text()='Hello, my name is Jeff.']"))
    )
    

    【讨论】:

    • 我相信我的 XPATH 每次运行都会发生变化,所以我会避免它。还有其他可行的选择吗?
    • 请分享一个指向该页面的链接或至少该页面的 HTML 代码,我希望我们能够唯一地定位该元素
    • 这是一个应用程序,所以我没有 HTML。我有 elementId、index、package、class、text 和 resource-id,哪些会有帮助?
    • 它应该是一些独特的属性。或属性/值的唯一序列。现在我明白了,这是一个移动应用程序,但我不知道什么属性值或序列是唯一的。
    • 没有理由不将 Xpath 与 contains 一起使用,因为您的路径会更改并且您没有唯一属性,因此此答案将是您唯一可以依赖的稳定答案。如果您使用 xpath 的 contains 来查找元素,xpath 变化的问题是什么?无论 DOM 中发生什么,如果您正在寻找包含包含的特定 TEXT 并且它具有文本,您会找到它。
    【解决方案2】:

    你的问题

    元素的可见性是否是部分链接的低于标准选择 文字?

    不,绝对不。

    查看visibility_of_element_located 方法下面的内容:-

    """ An expectation for checking that an element is present on the DOM of a
    page and visible. Visibility means that the element is not only displayed
    but also has a height and width that is greater than 0.
    locator - used to find the element
    returns the WebElement once it is located and visible
    """
    
    class visibility_of_element_located(object):
        def __init__(self, locator):
            self.locator = locator
    
        def __call__(self, driver):
            try:
                return _element_if_visible(_find_element(driver, self.locator))
            except StaleElementReferenceException:
                return False
    

    所以基本上它会调用,

    _element_if_visible
    

    这就是我们所拥有的

    def _element_if_visible(element, visibility=True):
        return element if element.is_displayed() == visibility else False
    

    所以,对您的问题的直接回答是否定的。但这取决于您如何定义 EC,在您的情况下,您确定这是唯一的 link_text 还是 partial_link_text, 您是否尝试将其更改为 css 或 xpath 并进行如下验证?

    //*[contains(text(),'Hello')]
    

    在代码中:

    msg_receive_1 = WebDriverWait(driver1, 15).until(
            EC.visibility_of_element_located((By.XPATH, "//*[contains(text(),'Hello')]"))
        )
    

    作为 xpath ?

    【讨论】:

    • 我相信我的 XPATH 每次运行都会发生变化,所以我会避免它。还有其他可行的选择吗?
    • 是的,你能分享 HTML 吗?有 8 个已知的定位器,我们也可以和其他人一起尝试一下
    • 我认为我的应用没有 HTML 值(如果有,Appium 不会给我那个)。我有 elementId、index、package、class、text 和 resource-id。
    • 如何区分标签?即使对于移动应用程序,您也需要唯一标识元素
    猜你喜欢
    • 2018-06-30
    • 2013-12-29
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多