有没有办法测试元素是否存在?任何findElement方法都会以异常结束,但这不是我想要的,因为它可能是一个元素不存在而且没关系,这不是测试的失败,因此异常不能成为解决方案.
我发现这篇文章:Selenium c#Webdriver:等到元素存在 但是这是C#而我不是很擅长.任何人都可以将代码翻译成Java吗?我很抱歉,我在Eclipse中尝试过但是我没有把它直接用到Java代码中.
这是代码:
public static class WebDriverExtensions{
public static IWebElement FindElement(this IWebDriver driver, By by, int timeoutInSeconds){
if (timeoutInSeconds > 0){
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
return wait.Until(drv => drv.FindElement(by));
}
return driver.FindElement(by);
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个用Selenium测试的Web应用程序.页面加载时会运行很多JavaScript.
这段JavaScript代码编写得不是很好,但我无法改变任何东西.所以等待元素出现在DOM中的findElement()方法不是一种选择.
我想在Java中创建一个通用函数来等待页面加载,可能的解决方案是:
document.body.innerHTML在字符串变量中body.body变量与之前版本进行比较body.如果它们相同则设置增量计数器,notChangedCount否则设置notChangedCount为零.notChangedCount >= 10那么退出循环,否则循环到第一步.你认为这是一个有效的解决方案吗?
当尝试使用ExpectedConditions显式等待元素变得可见时,Visual Studio警告我它现在已经过时,很快就会从Selenium中删除.
实现相同结果的当前/新方法是什么?
var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 30));
var element = wait.Until(ExpectedConditions.ElementIsVisible(By.Id("content-section")));
Run Code Online (Sandbox Code Playgroud) (从Java-Selenium迁移到C#-Selenium)
当使用Selenium和C#搜索显式等待时,我发现几个帖子的代码看起来类似于Java-Counterpart:
例如这里:
WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0,0,5));
wait.Until(By.Id("login"));
Run Code Online (Sandbox Code Playgroud)
或者在这里:
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("locator")));
Run Code Online (Sandbox Code Playgroud)
WebDriverWait来自OpenQA.Selenium.Support.UI命名空间,并且位于一个名为Selenium WebDriver支持类的单独包中
但是:
当我尝试在Visual Studio中编写代码(通过NuGet获取Selenium包)时,WebDriverWait在我的代码中使用将提示消息:
找不到类型或命名空间名称'WebDriverWait'(您是否缺少using指令或程序集引用?)
即使我通过包括Selenium参考
using OpenQA.Selenium;
Run Code Online (Sandbox Code Playgroud)
在查找WebDriverWait的文档时,您会发现应该有一个名为的命名空间
OpenQA.Selenium.Support.UI
但我无法通过代码中的"使用"访问它.
为什么会这样?我在哪里可以找到WebDriverWait类?
我是selenium webdriver的新手,正在测试一个应用程序.在我的应用程序中,我必须测试关于Facebook帐户的链接.每当我点击链接时,弹出窗口都会显示在我必须输入凭据的位置.我有时能够链接,有时测试失败.我知道原因是因为加载弹出窗口需要时间并且执行下一个命令因此无法找到该元素.我使用过Thread.Sleep,但是我想使用隐式等待或显式等待,这总是一个很好的做法,而不是Thread.Sleep.如何使用隐式等待以及在哪里使用该命令?请指教.谢谢.
public void SocialFaceBook()
{
string currentWindow = driver.CurrentWindowHandle;
PopupWindowFinder finder = new PopupWindowFinder(driver);
string facebookWindow = finder.Click(driver.FindElement(By.XPath("//div[@id='panelFacebook']/div[2]/div[3]/div[3]/a")));
// Switch To FaceBook Window
driver.SwitchTo().Window(facebookWindow);
System.Threading.Thread.Sleep(3000);
// Link
// Email Address
IWebElement faceBookLinkEmail = driver.FindElement(By.Id("email"));
faceBookLinkEmail.SendKeys(SocialFaceBookEmail);
// Password
IWebElement faceBookLinkPass = driver.FindElement(By.Id("pass"));
faceBookLinkPass.SendKeys(SocialFaceBookPass);
// Log In Button
IWebElement faceBookLinkLogin = driver.FindElement(By.XPath("//input[@id='u_0_1']"));
faceBookLinkLogin.Click();
// Switch To Main Window
driver.SwitchTo().Window(currentWindow);
System.Threading.Thread.Sleep(3000);
// Sync
IWebElement faceBookSync = driver.FindElement(By.XPath("//div[@id='panelFacebook']/div[2]/div[3]/div[2]/a"));
faceBookSync.Click();
// Unlink
IWebElement faceBookUnLink = driver.FindElement(By.XPath("//div[@id='panelFacebook']/div[2]/div[3]/div[1]/a"));
faceBookUnLink.Click();
}
Run Code Online (Sandbox Code Playgroud)
有时它无法找到登录详细信息,因为弹出窗口未正确加载,有时无法找到同步按钮,因为Facebook帐户需要时间链接.请指教.
我们有一个 .NET 4.5、MVC、C# 项目。我们使用 Selenium 进行 UI 测试,并且测试在我们拥有的线路上不断间歇性失败wait.Until()。其中一个例子是:
NoSuchElementException was unhandled by user code
An exception of type 'OpenQA.Selenium.NoSuchElementException' occurred in WebDriver.dll but was not handled in user code
Additional information: Unable to locate element: {"method":"css selector","selector":"#assessment-472 .status-PushedToSEAS"}
Run Code Online (Sandbox Code Playgroud)
它就被扔在这里:
Thread.Sleep(600);
wait.Until(drv => drv.FindElement(By.CssSelector("#" + assessmentQueueId + " .status-PushedToSEAS")));
Run Code Online (Sandbox Code Playgroud)
我可以看到浏览器打开,我看到它到达了这一点,并且我可以检查元素以查看该元素是否存在。它的 id 是完全正确的。
我们经常遇到这个问题,到目前为止,解决方案就是将其抛出Thread.Sleep(600)(或类似的时间)。重点wait.Until()是不必这样做,这使得我们的测试套件变得很长。Thread.Sleep()另外,正如您在上面的示例中所看到的,有时即使在前面加上 ,我们也会遇到问题,我们必须延长时间。
为什么 .NET SeleniumWebDriver.Until()不起作用,是否有不同的方法可以完成同样的事情,而无需等待一段时间?同样,这个问题是间歇性的,这意味着它只是有时发生,并且它可能发生在任意数量的wait.Until()语句中,而不仅仅是显示的语句!
编辑:
这是一个类变量。
private WebDriverWait wait;
它的实例化如下:
this.wait = new WebDriverWait(driver, …Run Code Online (Sandbox Code Playgroud) 我有以下代码用于从给定列表中选择一个选项,它通常可以工作,但有时它会因第二个 if 上的 NoSuchElement 异常而失败。我的印象是,如果它找不到元素,它只会再次返回循环。我相信解释很简单......有人可以启发我吗?
public static void selectFromList(String vList, String vText, IWebDriver driver)
{
for (int sec = 0; ; sec++)
{
System.Threading.Thread.Sleep(2500);
if (sec >= 10) Debug.Fail("timeout : " + vList);
if (driver.FindElement(By.Id(ConfigurationManager.AppSettings[vList])).Displayed) break;
}
new SelectElement(driver.FindElement(By.Id(ConfigurationManager.AppSettings[vList]))).SelectByText(vText);
}
Run Code Online (Sandbox Code Playgroud) 我需要在我的自动化测试用例的每个操作之后使用这个“Thread.sleep(5000)”命令。是否有任何其他方法可以在每次操作后跳过编写此命令。
如果我跳过此命令,则会出现“超时”和“未找到元素”错误。
使用C#我试图像这样替换输入框中的值
Run Code Online (Sandbox Code Playgroud)for (int second = 0; ; second++) { if (second >= 60) Assert.Fail("timeout"); if (second > 15) break; Thread.Sleep(1000); } driver.FindElement(By.Id("input1")).Clear(); driver.FindElement(By.Id("input1")).SendKeys(xxxx");
但是我在clear()行上得到错误"元素当前不是难以处理并且可能不被操作",为什么我会等到页面加载?
HTML
<input class="valid" id="input1" name="input1" value="http://dddd" nametemplate="url_to_5D" type="text">
Run Code Online (Sandbox Code Playgroud)