GVKun编程网logo

限制Selenium FindElement()的超时时间(selenium 超时设置)

7

此处将为大家介绍关于限制SeleniumFindElement的详细内容,并且为您解答有关的超时时间的相关问题,此外,我们还将为您介绍关于C#Appium/SeleniumDeriveWindowsE

此处将为大家介绍关于限制Selenium FindElement的详细内容,并且为您解答有关的超时时间的相关问题,此外,我们还将为您介绍关于C# Appium/Selenium Derive WindowsElement 抛出错误、findElement 的 Selenium xpath 语法错误、Handle AJAX elements in Selenium 2 (WebDriver)、Python selenium find_element()示例详解的有用信息。

本文目录一览:

限制Selenium FindElement()的超时时间(selenium 超时设置)

限制Selenium FindElement()的超时时间(selenium 超时设置)

如何限制/减少的超时时间FindElement?我正在抓取一个网站。对于出现在成千上万页中的表,我可以有一个元素说明没有信息,也可以有一个表。我搜索这些元素之一,而当缺少时,我搜索其他元素。问题在于,当其中一个不存在时,要花很长时间才能FindElement超时。这段时间可以缩短吗?可以为每个元素定义超时期限吗?我发现有关等待的所有内容都是为了延长超时时间…如果可以,我正在.NET环境中工作。

答案1

小编典典

延迟FindElement是由“隐式等待”设置引起的。您可以将其临时设置为其他值

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(0)); // setting to 0 will check one time only when using FindElement// look for the elementsdriver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(original settings));

C# Appium/Selenium Derive WindowsElement 抛出错误

C# Appium/Selenium Derive WindowsElement 抛出错误

如何解决C# Appium/Selenium Derive WindowsElement 抛出错误?

在我的 C# .NET Framework 4.8 项目中,我试图派生 WindowsElement 类以在新类中实现一些附加功能。 例如 ClickInMiddleOfControlIsVisibleSelectedItem(在组合框中)。

public class WindowsElementWrapper : WindowsElement
{
    public WindowsElementWrapper(RemoteWebDriver parent,string id) : base(parent,id) { }

    public void ClickInMiddleOfControl()
    {
        var rect = this.Rect;
        var offsetx = (int)(0.5 * rect.Width);
        var offsety = (int)(0.5 * rect.Height);
        new Actions(Helper.Session)
            .MovetoElement(this,0)
            .MoveByOffset(offsetx,offsety)
            .Click()
            .Build()
            .Perform();
    }
}

然后我尝试将 WindowsElement 转换为我的 WindowsElementWrapper。

var element = (WindowsElementWrapper)Session.FindElementByName("ElementName");
element.ClickInMiddleOfControl();

但在运行时我收到以下错误消息:

system.invalidCastException: ''无法转换类型的对象 OpenQA.Selenium.Appium.Windows.WindowsElement'' 输入 ''WEW.WindowsElementWrapper''。''

是否不能从 WindowsElement 类派生?还是我犯了一个根本性的错误?

解决方法

WindowsElementWindowsElementWrapper 的转换是沮丧

为了使向下转型成功,对象的运行时类型必须是目标类型本身,或者是从它派生的类型。

虽然 WindowsElementWrapperWindowsElement,但 WindowsElement 不一定是 WindowsElementWrapper

换句话说,这种向下转换永远不会成功,除非 SeleniumAPI 实例化对象作为一个 WindowsElementWrapper 开始。

为了实现您想要做的事情,您可以应用以下设计之一:


组成

public class WindowsElementWrapper
{
   private readonly WindowsElement element;

   public WindowsElementWrapper(WindowsElement element,(int Width,int Height) rect)
   {
      this.element = element;
      Rect = rect;
   }

   public (int Width,int Height) Rect { get; init; }

   public void ClickInMiddleOfControl()
      => new Actions(Helper.Session)
            .MoveToElement(element,0)
            .MoveByOffset(Rect.Width / 2,Rect.Height / 2)
            .Click()
            .Build()
            .Perform();
}

扩展方法

public static class Extensions
{
   public static void ClickInMiddleOfControl(this WindowsElement source,int Height) rect)
      => new Actions(Helper.Session)
            .MoveToElement(source,0)
            .MoveByOffset(rect.Width / 2,rect.Height / 2)
            .Click()
            .Build()
            .Perform();
}

最好的问候

findElement 的 Selenium xpath 语法错误

findElement 的 Selenium xpath 语法错误

如何解决findElement 的 Selenium xpath 语法错误?

我刚刚开始使用 Selenium 进行自动化测试,并且一直在通过 udemy 学习教程。

一旦用户登录,我就找到了导航栏的 xpath,以确保该人已登录。在控制台中对其进行了测试,它可以找到导航栏。在我的脚本中设置它,它返回一个语法错误。

这是我试图定位的导航栏的 html:

<ui-viewhttps://www.jb51.cc/tag/cop/" target="_blank">cope">
  <app-route >
    <div>
      <app-headerhttps://www.jb51.cc/tag/cop/" target="_blank">cope">
        <header>
          <nav>

我的 xpath 代码:

WebElement navBar = driver.findElement(By.xpath("//ui-view[@ng-scope'']/app-route/div[@AppWrapper]/app-header[@ng-isolate-scope'']//nav[@NavBar'']"));

错误:

[ERROR] Tests run: 1,Failures: 1,Errors: 0,Skipped: 0,Time elapsed: 13.796 s <<< FAILURE! - in com.testing.autoTest
[ERROR] com.testing.autoTest.loginTest  Time elapsed: 8.387 s  <<< FAILURE!
org.openqa.selenium.InvalidSelectorException: 
invalid selector: Unable to locate an element with the xpath expression //ui-view[@ng-scope'']/app-route/div[@AppWrapper]/app-header[@ng-isolate-scope'']//nav[@NavBar''] because of the following error:
SyntaxError: Failed to execute ''evaluate'' on ''Document'': The string ''//ui-view[@ng-scope'']/app-route/div[@AppWrapper]/app-header[@ng-isolate-scope'']//nav[@NavBar'']'' is not a valid XPath expression.

控制台测试:

$x("//ui-view[@ng-scope'']/app-route/div[@AppWrapper'']/app-header[@ng-isolate-scope'']//nav[@NavBar'']")
[nav.NavBar]0: nav.NavBarlength: 1__proto__: Array(0)

我已将 xpath 分解为以 //ui-view[@ng-scope''] 开头的增量块,并逐渐向其中添加更多块,似乎一旦到达 //ui-view[@ng-scope'']/app-route/div[@AppWrapper],测试就会失败。

我也尝试过在页面上使用其他元素,但它在同一点中断。

如有任何提示,将不胜感激,谢谢。

编辑: zx485 指出的错误导致新错误:

[ERROR] com.testing.autoTest.loginTest  Time elapsed: 9.271 s  <<< FAILURE!
org.openqa.selenium.NoSuchElementException: 
no such element: Unable to locate element: {"method":"xpath","selector":"//ui-view[@ng-scope'']/app-route/div[@AppWrapper'']/app-header[@ng-isolate-scope'']//nav[@NavBar'']"}

编辑 2:我发现了第二个错误的问题,测试试图在元素加载之前运行得太快,因此在查找导航栏之前添加了一个 sleep(3000); 计时器并且测试通过了

解决方法

如评论中所述,您有一个类型 - 在 '' 中缺少结束 div[@AppWrapper]
但是我建议使用这个定位器:

//nav[@NavBar'']

这应该足够独特。

Handle AJAX elements in Selenium 2 (WebDriver)

Handle AJAX elements in Selenium 2 (WebDriver)

总结

以上是小编为你收集整理的Handle AJAX elements in Selenium 2 (WebDriver)全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

Python selenium find_element()示例详解

Python selenium find_element()示例详解

selenium有以下定位方式:

driver.find_element_by_id(‘id'')
driver.find_element_by_xpath(''xpath'')
driver.find_element_by_link_text(''link_text'')
driver.find_element_by_partial_link_text(''partial_link_text'')
driver.find_element_by_name(''name'')
driver.find_element_by_tag_name(''tag_name'')
driver.find_element_by_class_name(''class_name'')
driver.find_element_by_css_selector(''css_selector'')

但我们看下源码:

D:\Program Files\Python27\Lib\site-packages\selenium\webdriver\remote\webdriver.py

可以看到,上面那些定位方式,实际上都是调用的driver.find_element(by, value)

我们继续看下find_element()的源码,大部分方法最终全是通过By.CSS_SELECTOR来实现的查找

那By又都有哪些条件呢?

D:\Program Files\Python27\Lib\site-packages\selenium\webdriver\common\by.py

继续看源码,可以看到下面8种

ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"

所以我们以后就都只用find_element()就好了,因为最终实际上也都是调用的这个方法。

简单封装一下,以后就记住find_element()一个方法即可。

from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from appium import webdriver

class BasePage(object):
    def split_locator(self, locator):
        """
        分解定位表达式,如''css,.username'',拆分后返回''css selector''和定位表达式''.username''(class为username的元素)
        :param locator: 定位方法+定位表达式组合字符串,如''css,.username''
        :return: locator_dict[by], value:返回定位方式和定位表达式
        """
        by = locator.split('','')[0]
        value = locator.split('','')[1]
        locator_dict = {
            ''id'': ''id'',
            ''name'': ''name'',
            ''class'': ''class name'',
            ''tag'': ''tag name'',
            ''link'': ''link text'',
            ''plink'': ''partial link text'',
            ''xpath'': ''xpath'',
            ''css'': ''css selector'',
        }
        if by not in locator_dict.keys():
            raise NameError("wrong locator!''id'',''name'',''class'',''tag'',''link'',''plink'',''xpath'',''css'',exp:''id,username''")
        return locator_dict[by], value


    def wait_element(self, locator, sec=30):
        """
        等待元素出现
        :param locator: 定位方法+定位表达式组合字符串,用逗号分隔,如''css,.username''
        :param sec:等待秒数
        """
        by, value = self.split_locator(locator)
        try:
            WebDriverWait(self.driver, sec, 1).until(lambda x: x.find_element(by=by, value=value),message=''element not found!!!'')
            log.info(u''等待元素:%s'' % locator)
        return True
        except TimeoutException:
            return False
        except Exception, e:
            raise e

    
    def get_element(self, locator, sec=60):
        """
        获取一个元素
        :param locator: 定位方法+定位表达式组合字符串,用逗号分隔,如''css,.username''
        :param sec:等待秒数
        :return: 元素可找到返回element对象,否则返回False
        """
        if self.wait_element(locator, sec):
            by, value = self.split_locator(locator)
            try:
                element = self.driver.find_element(by=by, value=value)
                log.info(u''获取元素:%s'' % locator)
                return element
            except Exception, e:
                raise e
        else:
            return False

    def get_elements(self, locator):
        """
        获取一组元素
        :param locator: 定位方法+定位表达式组合字符串,用逗号分隔,如''css,.username''
        :return: elements
        """
        by, value = self.split_locator(locator)
        try:
            elements = WebDriverWait(self.driver, 60, 1).until(lambda x: x.find_elements(by=by, value=value))
            log.info(u''获取元素列表:%s'' % locator)
            return elements
        except Exception, e:
            raise e

以后调用,先定义元素,如

button = "id,su" # 页面上id为su的元素

在用例中查找时,只要写

find_element(button)

整体框架源码:

https://github.com/songzhenhua/selenium_ui_auto/blob/master/page_object/base_page.py

总结

到此这篇关于Python selenium find_element()详解的文章就介绍到这了,更多相关selenium find_element()详解内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

关于限制Selenium FindElement的超时时间的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于C# Appium/Selenium Derive WindowsElement 抛出错误、findElement 的 Selenium xpath 语法错误、Handle AJAX elements in Selenium 2 (WebDriver)、Python selenium find_element()示例详解等相关知识的信息别忘了在本站进行查找喔。

本文标签: